MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
SQL Server - 条件分岐のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
SQL Server - 条件分岐
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == SQL ServerのTransact-SQLで条件分岐(IF ~ ELSE)を実装する方法を記載する。<br> <br> また、IF文を記述すれば、WHERE句の内容を変えて検索できるが、<br> 条件ごとに同じようなSQL文を複数記述するのは面倒なので、1行で分岐できるIIF文を記載する。<br> <br><br> == IF文 == 以下に、<code>IF</code>文のシンタックスを示す。<br> <br> <処理>が複数行ある場合は、<code>BEGIN</code>と<code>END</code>が必要となる。<br> <条件>が合致する場合、配下の処理が実行されて、<code>IF</code>文の処理は終了する。<br> <条件>が合致しない場合、配下の処理は実行されず、<code>ELSE IF</code>文または<code>ELSE</code>文に進む。<br> <syntaxhighlight lang="sql"> IF <条件> BEGIN <処理> END ELSE IF <条件> BEGIN <処理> END ELSE BEGIN <処理> END </syntaxhighlight> <br> 以下の例では、6行目で値を代入した変数により、条件分岐している。<br> また、<code>IF</code>文の条件式に丸括弧<code>()</code>を付けることができる。<br> <syntaxhighlight lang="sql"> CREATE PROCEDURE dbo.TEST1 AS BEGIN DECLARE @num1 INT DECLARE @msg1 VARCHAR(20) SET @num1 = 11 IF (@num1 = 0) BEGIN SET @msg1 = '0です' END ELSE IF @num1 = 1 BEGIN SET @msg1 = '1です' END ELSE BEGIN SET @msg1 = 'その他' END PRINT @msg1 --1です END </syntaxhighlight> <br> また、<code>IF</code>文をネストすることもできる。<br> <syntaxhighlight lang="sql"> CREATE PROCEDURE dbo.TEST1 AS BEGIN DECLARE @num1 INT DECLARE @num2 INT DECLARE @msg1 VARCHAR(20) SET @num1 = 1 SET @num2 = 1 IF (@num1 = 1) BEGIN IF (@num2 = 1) BEGIN SET @msg1 = '1' END END PRINT @msg1 --1 END </syntaxhighlight> <br><br> == 論理演算子の論理積 (AND) == 論理積(AND)の左の式と右の式の両方が条件に合致する場合、真(true)となる。<br> <syntaxhighlight lang="sql"> IF <左の条件式> AND <右の条件式> </syntaxhighlight> <br> <syntaxhighlight lang="sql"> CREATE PROCEDURE dbo.T_TEST AS BEGIN DECLARE @num1 INT DECLARE @num2 INT DECLARE @msg1 VARCHAR(20) SET @num1 = 1 SET @num2 = 0 IF (@num1 = 1) AND (@num2 = 0) BEGIN SET @msg1 = 'OK' END ELSE BEGIN SET @msg1 = 'NG' END PRINT @msg1 --OKが出力される END </syntaxhighlight> <br><br> == 論理演算子の論理和 (OR) == 論理和(OR)の左の条件式または右の条件式のどちらかが条件に合致する場合、真(true)となる。<br> <syntaxhighlight lang="sql"> IF <左の条件式> OR <右の条件式> </syntaxhighlight> <br> <syntaxhighlight lang="sql"> CREATE PROCEDURE dbo.T_TEST AS BEGIN DECLARE @num1 INT DECLARE @num2 INT DECLARE @msg1 VARCHAR(20) SET @num1 = 2 SET @num2 = 0 IF (@num1 = 1) OR (@num2 = 0) BEGIN SET @msg1 = 'OK' END ELSE BEGIN SET @msg1 = 'NG' END PRINT @msg1 --OKが出力される END </syntaxhighlight> <br><br> == 論理演算子の否定 (NOT) == <条件式>がfalseの場合、真(true)となる。<br> また、<条件式>がtrueの場合、偽(false)となる。<br> <syntaxhighlight lang="sql"> IF NOT<条件式> -- または IF !<条件式> </syntaxhighlight> <br> 以下の例では、8行目の条件式によりtrueとなり、それを否定するため、falseとなる。<br> <syntaxhighlight lang="sql"> CREATE PROCEDURE dbo.T_TEST AS BEGIN DECLARE @num1 INT DECLARE @msg1 VARCHAR(20) SET @num1 = 9 IF NOT(@num1 = 9) BEGIN SET @msg1 = 'OK' END ELSE BEGIN SET @msg1 = 'NG' END PRINT @msg1 --NGが出力される END </syntaxhighlight> <br> 以下の例のように、<code>!=</code>演算子を使用しても否定となる。<br> <syntaxhighlight lang="sql"> IF (@num1 != 9) BEGIN SET @msg1 = 'OK' END ELSE BEGIN SET @msg1 = 'NG' END </syntaxhighlight> <br><br> == 条件分岐を用いてテーブルを削除する == * '''SQLServer 2016以降''' :テーブル名はスキーマ.テーブル名と指定することもできる。 <syntaxhighlight lang="sql"> DROP TABLE IF EXISTS [テーブル名] </syntaxhighlight> <br> * '''SQL Server 2016以前''' :DROP TABLE IF EXISTS テーブル名が使用できないので、OBJECT_ID()関数を使用してテーブルの存在の有無を確認する。 :また、テーブル名は[スキーマ名].[テーブル名]と指定することもできる。 <syntaxhighlight lang="sql"> IF OBJECT_ID(N'テーブル名', N'U') IS NOT NULL BEGIN DROP TABLE [テーブル名] END </syntaxhighlight> <br> :一時テーブルも通常のテーブルと同様で、上記の手順で削除することが出来る。 :ストアドプロシージャとして実行している場合、実行後に一時テーブルが自動で削除されるが(存在の確認は不要)、コメントアウトしても構わない。 :また、コメントアウトしなくても特に問題は無いので、SSMSで操作する可能性がある場合は残しておいても構わない。 <syntaxhighlight lang="sql"> IF OBJECT_ID(N'[#テーブル名]', N'U') IS NOT NULL BEGIN DROP TABLE [#テーブル名] CREATE TABLE [#テーブル名]( hoge INT, piyo NVARCHAR(20), huga VARBINARY(max)) END </syntaxhighlight> <br><br> == IIF文 == SQL Server 2012からIF文を1つにまとめたIIF文が使用できる。<br> 評価の結果に基づいて、他の2つの引数のいずれかを返す。(ACCESSやVisual Basicでは馴染みの関数である)<br> <br> ===== IIF文の構文 ===== IIF文の第1パラメータの式がtrueであれば、第2パラメータを返して、falseであれば第3パラメータを返す。<br> <syntaxhighlight lang="sql"> --IIF文でscoreカラムが70以上であれば合格、70未満は不合格とする SELECT score,IIF(score >= 70, '合格', '不合格') res FROM table1; </syntaxhighlight> <br><br> == CASE文 == CASE文を使用して、条件の判定ができる。<br> <br> 8行目は変数に値を代入して、14行目で変数の値を出力している。<br> <syntaxhighlight lang="sql"> CREATE PROCEDURE dbo.T_TEST AS BEGIN DECLARE @num1 INT DECLARE @msg1 VARCHAR(20) SET @num1 = 1 SET @msg1 = CASE @num1 WHEN 0 THEN '0です' WHEN 1 THEN '1です' ELSE 'その他' END PRINT @msg1 --"1です"が出力される END </syntaxhighlight> <br><br> == NULLとの比較 == 以下の例では、NULL値と比較している。<br> <br> 10行目は、<code>IS NULL</code>句を使用して、変数の値がNULLかどうかを確認している。<br> 17行目は、<code>IS NOT NULL</code>句を使用して、変数の値がNULLかどうかを確認している。<br> <syntaxhighlight lang="sql"> CREATE PROCEDURE dbo.T_TEST AS BEGIN DECLARE @str1 VARCHAR(20) DECLARE @str2 VARCHAR(20) DECLARE @msg1 VARCHAR(20) SET @str1 = NULL SET @str2 = 'TEST' IF (@str1 IS NULL) BEGIN SET @msg1 = 'NULLである' END PRINT @msg1 -- NULLである IF (@str2 IS NOT NULL) BEGIN SET @msg1 = 'NULLでない' END PRINT @msg1 -- NULLでない END </syntaxhighlight> <br><br> == CASE WHEN文で条件分岐 == <code>WHERE</code>句の条件に<code>CASE WHEN</code>を使用して、条件分岐を行う。<br> <br> ===== テーブルとデータの準備 ===== まず、テーブルとその検索用データを作成する。<br> <syntaxhighlight lang="sql"> CREATE TABLE 社員マスタ ( 社員番号 INT, 氏名 VARCHAR(20), 部署 VARCHAR(20) ) </syntaxhighlight> <br> <syntaxhighlight lang="sql"> INSERT INTO 社員マスタ VALUES (1, '太郎さん', '営業部' ) INSERT INTO 社員マスタ VALUES (2, '次郎さん', '経理部' ) INSERT INTO 社員マスタ VALUES (3, '三郎さん', '人事部' ) INSERT INTO 社員マスタ VALUES (4, '四郎さん', '営業部' ) INSERT INTO 社員マスタ VALUES (5, '五郎さん', '経理部' ) INSERT INTO 社員マスタ VALUES (6, '六郎さん', '人事部' ) INSERT INTO 社員マスタ VALUES (7, '七郎さん', '営業部' ) INSERT INTO 社員マスタ VALUES (8, '八郎さん', '経理部' ) INSERT INTO 社員マスタ VALUES (9, '九郎さん', '人事部' ) </syntaxhighlight> <br> ===== 条件を分岐させて検索 ===== 社員番号を指定せずに全件取得する場合と、社員番号を指定して1件のみに絞り込んだものを実行する。<br> <syntaxhighlight lang="sql"> -- 全件検索 DECLARE @検索社員番号 int = NULL SELECT * FROM 社員マスタ WHERE 社員番号 = CASE WHEN @検索社員番号 IS NULL THEN 社員番号 ELSE @検索社員番号 END </syntaxhighlight> <br> 実行結果 社員番号 氏名 部署 1 太郎さん 営業部 2 次郎さん 経理部 3 三郎さん 人事部 4 四郎さん 営業部 5 五郎さん 経理部 6 六郎さん 人事部 7 七郎さん 営業部 8 八郎さん 経理部 9 九郎さん 人事部 <br> <syntaxhighlight lang="sql"> -- 社員番号を指定して取得 DECLARE @検索社員番号 int = 5 SELECT * FROM 社員マスタ WHERE 社員番号 = CASE WHEN @検索社員番号 IS NULL THEN 社員番号 ELSE @検索社員番号 END </syntaxhighlight> <br> 実行結果 社員番号 氏名 部署 5 五郎さん 経理部 <br> ===== 解説 ===== <code>WHERE 社員番号 = CASE WHEN @検索社員番号 IS NULL THEN 社員番号 ELSE @検索社員番号 END</code>において、<br> <code>CASE WHEN</code>文を使用することで、条件が指定されてない(@検索社員番号がNULL)場合は、テーブルの値をそのまま使用し、<br> 条件が指定された(@検索社員番号がNULL以外)の場合は、その指定された値で検索する。<br> <br> SQL文を記述する量を少なくすることができる。<br> <br><br> {{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux |image=/resources/assets/MochiuLogo_Single_Blue.png }} __FORCETOC__ [[カテゴリ:SQL_Server]]
SQL Server - 条件分岐
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse