SQL Server IF…ELSE 条件文: T-SQL 選択例

⚡ スマートサマリー

IF…ELSE は SQL Server の制御フロー文であり、ブール条件が真と評価された場合に 1 つの T-SQL ブロックを実行し、同じ条件が偽と評価された場合にオプションの代替ブロックを実行します。

  • 🧭 条件ロジック: 条件文を使用すると、SQL Server は条件が真か偽かに応じて異なる T-SQL アクションを実行できます。
  • ✅ IF文とELSE文の分岐: ブール条件が真の場合はIFブロックが実行され、偽の場合は代わりにオプションのELSEブロックが実行されます。
  • 🔢 ブール式: 条件は、(1=1) のように真または偽と評価されるブール式、または変数比較である必要があります。
  • 🧱 BEGIN…ENDブロック: 複数のステートメントを実行する分岐では、それらのステートメントをBEGINキーワードとENDキーワードで囲む必要があります。
  • ➖ ELSEは省略可能です。 IF文はELSE部分がなくても単独で機能するため、条件が偽の場合は何も実行されません。
  • 🔁 入れ子になった条件: SQL ServerにはELSE IFキーワードがないため、複数のしきい値をテストするには、IF…ELSE文をネストして別のIF…ELSE文の中に入れます。

SQL ServerのIF…ELSE条件文とT-SQL SELECTクエリの例

なぜ条件文が必要なのでしょうか?

SQL Server の条件文を使用すると、さまざまな条件に対して異なるロジックとアクションを定義できます。条件文で定義された条件に基づいて、異なるアクションを実行できます。実際の生活では、他のアクティビティや状況の結果に応じて、多くのアクションを実行することになります。

条件文の実際の例をいくつか挙げます。

  • 明日雨が降ったら、ドライブ旅行を計画しよう。
  • もし私の住む街からの航空券が400ドル以下なら、ヨーロッパへ旅行に行きます。そうでなければ、近場の観光地に行く方を選びます。

ここでは、上記のロードトリップのような一つの行動が、「明日雨が降るかどうか」という別の活動の結果に条件付きで依存していることがわかります。同様に、MS SQLサーバー また、T-SQLステートメントを条件付きで実行する機能も提供します。

SQL Server の IF…ELSE ステートメント

MS SQL では、IF…ELSE は条件文の一種です。IF…ELSE を使用すると、任意の T-SQL ステートメントを条件付きで実行できます。以下の図は、SQL Server における IF および ELSE 分岐の動作を説明しています。

SQL ServerのIF…ELSEのフローチャート。真のIF分岐と偽のELSE分岐を示しています。

  • 条件が真と評価された場合、SQL Server の IF 条件に続く T-SQL ステートメントが実行されます。
  • 条件がFalseと評価された場合、ELSEキーワードに続くT-SQLステートメントが実行されます。
  • IF T-SQL文またはELSE T-SQL文のいずれかが実行されると、その他の無条件T-SQL文の実行が続行されます。

SQLにおけるIF…ELSE構文とルール

構文:

IF <Condition>
     {Statement | Block_of_statement}   
[ ELSE   
     {Statement | Block_of_statement}]

ルール:

  • 条件はブール式である必要があります。つまり、条件が評価されるとブール値が返されます。
  • SQLのIF…ELSE文は、単一のT-SQL文またはT-SQL文のブロックを条件付きで処理できます。
  • ステートメントのブロックは、キーワードBEGINで始まり、キーワードENDで終わる必要があります。
  • BEGINとENDを使用すると、SQL Serverは実行する必要のあるステートメントブロックを識別し、IF…ELSE T-SQLブロックの一部ではない残りのT-SQLステートメントから分離することができます。
  • ELSE はオプションです。

ブール式に数値のみを使用したIF…ELSE文

最初の例では、ブール式は数値のみを使用します。以下の条件を考えてみましょう。1は1に等しいので、この条件は常に真となります。

条件: TRUE

IF (1=1)
PRINT 'IF STATEMENT: CONDITION IS TRUE'
ELSE
PRINT 'ELSE STATEMENT: CONDITION IS FALSE'

真の条件(1=1)でクエリを実行すると、IF分岐メッセージが表示されます。

数値IF条件が真であった結果、IFステートメントのメッセージが出力されます。

条件: 偽

IF (1=2)
PRINT 'IF STATEMENT: CONDITION IS TRUE'
ELSE
PRINT 'ELSE STATEMENT: CONDITION IS FALSE'

条件が偽(1=2)の場合、代わりにELSE分岐が実行されます。

誤った数値IF条件の結果、ELSE STATEMENTメッセージが出力されます。

' という名前のテーブルがあると仮定しますGuru99' は、以下に示すように、2 列 4 行で構成されます。Guru以下の例では、99' テーブルを使用します。

サンプル GuruTutorial_ID列と4行のデータを含む99テーブル

ブール式で変数を使用したIF…ELSE文

定数の代わりに、ブール式は 変数次の例では、整数型の変数を宣言し、その値をテストします。

条件: TRUE

DECLARE @Course_ID INT = 4

IF (@Course_ID = 4)
Select * from Guru99 where Tutorial_ID = 4
ELSE
Select * from Guru99 where Tutorial_ID != 4

@Course_IDが4に等しいため、IF分岐が実行され、Tutorial_IDが4である行が返されます。

変数条件が真の場合に、クエリ結果が Tutorial_ID 4 行を返す

条件: 偽

DECLARE @Course_ID INT = 4

IF (@Course_ID != 4)
Select * from Guru99 where Tutorial_ID = 4
ELSE
Select * from Guru99 where Tutorial_ID != 4

ここでは条件が偽なので、ELSE分岐が実行され、Tutorial_IDが4でないすべての行が返されます。

ELSE分岐からのクエリ結果。Tutorial_ID 4を除くすべての行が返されます。

IF…ELSE文とBEGIN…END文

分岐で複数のステートメントを実行する必要がある場合は、それらのステートメントをBEGIN…ENDブロックで囲みます。以下の例では、各分岐で2つのSELECTステートメントを実行しています。

条件: TRUE

DECLARE @Course_ID INT = 2

IF (@Course_ID <=2)
	BEGIN
	Select * from Guru99 where Tutorial_ID = 1
	Select * from Guru99 where Tutorial_ID = 2
	END
ELSE
	BEGIN
	Select * from Guru99 where Tutorial_ID = 3
	Select * from Guru99 where Tutorial_ID = 4
	END

@Course_ID が 2 以下であるため、IF ブロックは BEGIN…END 内の 2 つの SELECT ステートメントを実行します。

Tutorial_ID 1と2に対して2つのSELECT文を実行したIFブロックの結果

条件: 偽

DECLARE @Course_ID INT = 2

IF (@Course_ID >=3)
	BEGIN
	Select * from Guru99 where Tutorial_ID = 1
	Select * from Guru99 where Tutorial_ID = 2
	END
ELSE
	BEGIN
	Select * from Guru99 where Tutorial_ID = 3
	Select * from Guru99 where Tutorial_ID = 4
	END

今回は条件が偽なので、ELSEブロックは2つのSELECT文を実行します。

チュートリアルID 3と4に対して2つのSELECT文を実行したELSEブロックの結果

ELSE文のないIF文

SQLでは、ELSE部分が省略可能なため、IF文をELSE部分なしで使用できます。例:

DECLARE @Course_ID INT = 2

IF (@Course_ID <=2)
	Select * from Guru99 where Tutorial_ID = 1

以下のような1行が出力されます。

ELSE部分を持たないIF文によって出力される単一行の結果

偽の条件を実行しても出力はありません。次のクエリを考えてみましょう。

DECLARE @Course_ID INT = 2

IF (@Course_ID <=0)
	Select * from Guru99 where Tutorial_ID = 1

結果は空です。以下をご覧ください。

ELSE のない IF 条件が偽の場合、空の結果セットが生成されます。

ネストされたIF…ELSE文

他のいくつかとは異なり プログラミング言語SQL Serverでは、IF…ELSE条件の中にELSE IF文を挿入することはできません。代わりに、以下に示すように、IF…ELSE文をネストすることができます。

 DECLARE @age INT;
SET @age = 60;

IF @age < 18
   PRINT 'underage';
ELSE
BEGIN
   IF @age < 50
      PRINT 'You are below 50';
   ELSE
      PRINT 'Senior';
END;

年齢が60歳の場合、ネストされたIF…ELSEは次の結果を出力します。

ネストされたIF…ELSE文の結果、60歳に対して「Senior」と出力されました。

  • @ageの値が18歳未満の場合、コードは「underage」と出力します。
  • そうでない場合は、ELSE 部分が実行されます。ELSE 部分には、ネストされた IF…ELSE が含まれています。
  • @age の値が 50 未満の場合、「あなたは 50 未満です」と表示されます。これらの条件のいずれも満たされない場合、コードは「シニア」と表示します。

よくあるご質問

IF…ELSE は実行の流れを制御し、どの T-SQL ステートメントまたはブロックを実行するかを選択します。CASE は、SELECT 句や WHERE 句など、クエリ内で単一の値を返す式です。CASE では個別のステートメントを実行することはできません。

IIF() は、IF…ELSE 制御フロー文ではなく、CASE 式の省略形です。ブール値テストに基づいて 2 つの値のいずれかを返し、クエリ内で使用されます。IF…ELSE とは異なり、IIF() は個別の T-SQL ステートメントやブロックを実行することはできません。

いいえ。IF…ELSEは制御フロー文なので、SELECTリストやWHERE句の中に記述することはできません。クエリ内で条件付き値を返すには、代わりにCASE式またはIIF()関数を使用してください。

IF EXISTS (SELECT 1 FROM table WHERE condition) に続いて実行するステートメントを記述してください。EXISTS は、サブクエリが少なくとも 1 つの一致する行を見つけた場合に true を返すため、IF 分岐はデータが存在する場合にのみ実行されます。

はい。IF…ELSE は、ストアドプロシージャ、トリガー、関数、バッチ処理内でロジックを分岐させるために使用されます。BEGIN…END ブロックと組み合わせることで、パラメータやクエリ結果に応じて異なる SQL ステートメントを実行できます。

IF…ELSE は条件を一度評価し、一致する分岐を一度だけ実行します。WHILE ループは、条件が真である限り、ステートメントブロックを繰り返し実行します。分岐には IF…ELSE を、反復には WHILE を使用してください。

Yes. GitHubコパイロット 自然言語のプロンプトから、IF…ELSEブロック、BEGIN…ENDラッパー、およびネストされた条件を作成できます。データベースでスクリプトを実行する前に、生成されたブール条件と分岐ロジックを必ず確認してください。

AIと機械学習アシスタントは、平易な英語のルールをIF…ELSEまたはCASEロジックに変換し、不足している分岐を提案し、決して真になり得ない条件を警告します。開発者は、デプロイ前に各提案の正当性を確認します。