📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

文字列「__FORCETOC__」を「{{#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 pag…
 
(同じ利用者による、間の5版が非表示)
4行目: 4行目:
また、IF文を記述すれば、WHERE句の内容を変えて検索できるが、<br>
また、IF文を記述すれば、WHERE句の内容を変えて検索できるが、<br>
条件ごとに同じようなSQL文を複数記述するのは面倒なので、1行で分岐できるIIF文を記載する。<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>
<br><br>


9行目: 185行目:
* '''SQLServer 2016以降'''
* '''SQLServer 2016以降'''
:テーブル名はスキーマ.テーブル名と指定することもできる。
:テーブル名はスキーマ.テーブル名と指定することもできる。
  <source lang="sql">
  <syntaxhighlight lang="sql">
  DROP TABLE IF EXISTS [テーブル名]
  DROP TABLE IF EXISTS [テーブル名]
  </source>
  </syntaxhighlight>
<br>
<br>
* '''SQL Server 2016以前'''
* '''SQL Server 2016以前'''
:DROP TABLE IF EXISTS テーブル名が使用できないので、OBJECT_ID()関数を使用してテーブルの存在の有無を確認する。
:DROP TABLE IF EXISTS テーブル名が使用できないので、OBJECT_ID()関数を使用してテーブルの存在の有無を確認する。
:また、テーブル名は[スキーマ名].[テーブル名]と指定することもできる。
:また、テーブル名は[スキーマ名].[テーブル名]と指定することもできる。
  <source lang="sql">
  <syntaxhighlight lang="sql">
  IF OBJECT_ID(N'テーブル名', N'U') IS NOT NULL
  IF OBJECT_ID(N'テーブル名', N'U') IS NOT NULL
     BEGIN
     BEGIN
     DROP TABLE [テーブル名]
     DROP TABLE [テーブル名]
     END
     END
  </source>
  </syntaxhighlight>
<br>
<br>
:一時テーブルも通常のテーブルと同様で、上記の手順で削除することが出来る。
:一時テーブルも通常のテーブルと同様で、上記の手順で削除することが出来る。
:ストアドプロシージャとして実行している場合、実行後に一時テーブルが自動で削除されるが(存在の確認は不要)、コメントアウトしても構わない。
:ストアドプロシージャとして実行している場合、実行後に一時テーブルが自動で削除されるが(存在の確認は不要)、コメントアウトしても構わない。
:また、コメントアウトしなくても特に問題は無いので、SSMSで操作する可能性がある場合は残しておいても構わない。
:また、コメントアウトしなくても特に問題は無いので、SSMSで操作する可能性がある場合は残しておいても構わない。
  <source lang="sql">
  <syntaxhighlight lang="sql">
  IF OBJECT_ID(N'[#テーブル名]', N'U') IS NOT NULL
  IF OBJECT_ID(N'[#テーブル名]', N'U') IS NOT NULL
     BEGIN
     BEGIN
35行目: 211行目:
                               huga VARBINARY(max))
                               huga VARBINARY(max))
     END
     END
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


44行目: 220行目:
===== IIF文の構文 =====
===== IIF文の構文 =====
IIF文の第1パラメータの式がtrueであれば、第2パラメータを返して、falseであれば第3パラメータを返す。<br>
IIF文の第1パラメータの式がtrueであれば、第2パラメータを返して、falseであれば第3パラメータを返す。<br>
  <source lang="sql">
  <syntaxhighlight lang="sql">
  --IIF文でscoreカラムが70以上であれば合格、70未満は不合格とする
  --IIF文でscoreカラムが70以上であれば合格、70未満は不合格とする
  SELECT score,IIF(score >= 70, '合格', '不合格') res FROM table1;
  SELECT score,IIF(score >= 70, '合格', '不合格') res FROM table1;
  </source>
  </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>
<br><br>


== CASE WHEN文で条件分岐 ==
== CASE WHEN文で条件分岐 ==
WHERE句の条件にCASE WHENを使用して、条件分岐を行う。<br>
<code>WHERE</code>句の条件に<code>CASE WHEN</code>を使用して、条件分岐を行う。<br>
<br>
<br>
===== テーブルとデータの準備 =====
===== テーブルとデータの準備 =====
まず、テーブルとその検索用データを作成する。<br>
まず、テーブルとその検索用データを作成する。<br>
  <source lang="sql">
  <syntaxhighlight lang="sql">
  CREATE TABLE 社員マスタ
  CREATE TABLE 社員マスタ
  (
  (
62行目: 293行目:
     部署      VARCHAR(20)
     部署      VARCHAR(20)
  )
  )
  </source>
  </syntaxhighlight>
<br>
<br>
  <source lang="sql">
  <syntaxhighlight lang="sql">
  INSERT INTO 社員マスタ VALUES (1, '太郎さん', '営業部' )
  INSERT INTO 社員マスタ VALUES (1, '太郎さん', '営業部' )
  INSERT INTO 社員マスタ VALUES (2, '次郎さん', '経理部' )
  INSERT INTO 社員マスタ VALUES (2, '次郎さん', '経理部' )
74行目: 305行目:
  INSERT INTO 社員マスタ VALUES (8, '八郎さん', '経理部' )
  INSERT INTO 社員マスタ VALUES (8, '八郎さん', '経理部' )
  INSERT INTO 社員マスタ VALUES (9, '九郎さん', '人事部' )  
  INSERT INTO 社員マスタ VALUES (9, '九郎さん', '人事部' )  
  </source>
  </syntaxhighlight>
<br>
<br>
===== 条件を分岐させて検索 =====
===== 条件を分岐させて検索 =====
社員番号を指定せずに全件取得する場合と、社員番号を指定して1件のみに絞り込んだものを実行する。<br>
社員番号を指定せずに全件取得する場合と、社員番号を指定して1件のみに絞り込んだものを実行する。<br>
  <source lang="sql">
  <syntaxhighlight lang="sql">
  ; 全件検索
  -- 全件検索
   
   
  DECLARE @検索社員番号 int = NULL
  DECLARE @検索社員番号 int = NULL
87行目: 318行目:
     社員マスタ
     社員マスタ
  WHERE
  WHERE
     社員番号 = CASE WHEN @検索社員番号 IS NULL THEN 社員番号 ELSE @検索社員番号 END
     社員番号 = CASE WHEN @検索社員番号 IS NULL THEN 社員番号 ELSE @検索社員番号 END
  </source>
  </syntaxhighlight>
<br>
<br>
  ; 実行結果
  実行結果
   
   
  社員番号 氏名 部署
  社員番号 氏名 部署
103行目: 334行目:
  9 九郎さん 人事部
  9 九郎さん 人事部
<br>
<br>
  <source lang="sql">
  <syntaxhighlight lang="sql">
  ; 社員番号を指定して取得
  -- 社員番号を指定して取得
   
   
  DECLARE @検索社員番号 int = 5
  DECLARE @検索社員番号 int = 5
113行目: 344行目:
  WHERE
  WHERE
     社員番号 = CASE WHEN @検索社員番号 IS NULL THEN  社員番号 ELSE @検索社員番号 END
     社員番号 = CASE WHEN @検索社員番号 IS NULL THEN  社員番号 ELSE @検索社員番号 END
  </source>
  </syntaxhighlight>
<br>
<br>
  ; 実行結果
  実行結果
  社員番号 氏名 部署
  社員番号 氏名 部署
  5 五郎さん 経理部
  5 五郎さん 経理部
<br>
<br>
===== 解説 =====
===== 解説 =====
"WHERE 社員番号 = CASE WHEN @検索社員番号 IS NULL THEN  社員番号 ELSE @検索社員番号 END"において、<br>
<code>WHERE 社員番号 = CASE WHEN @検索社員番号 IS NULL THEN  社員番号 ELSE @検索社員番号 END</code>において、<br>
CASE WHEN文を使用することで、条件が指定されてない(@検索社員番号がNULL)場合は、テーブルの値をそのまま使用し、<br>
<code>CASE WHEN</code>文を使用することで、条件が指定されてない(@検索社員番号がNULL)場合は、テーブルの値をそのまま使用し、<br>
条件が指定された(@検索社員番号がNULL以外)の場合は、その指定された値で検索する。<br>
条件が指定された(@検索社員番号がNULL以外)の場合は、その指定された値で検索する。<br>
<br>
<br>
SQL文を記述する量を少なくすることができる。<br>
SQL文を記述する量を少なくすることができる。<br>
<br><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__
__FORCETOC__
[[カテゴリ:SQL_Server]]
[[カテゴリ:SQL_Server]]