SQL Server の CASE ステートメントと入れ子になったケース: T-SQL の例

⚡ スマートサマリー

CASEはSQL Serverの条件式で、最初に真と評価された条件に基づいて値を返します。シンプル形式と検索形式があり、IF…ELSE、UPDATE、ORDER BYの中にネストすることもできます。

  • 🧭 条件付き値: CASE式は、最初に真と評価されたWHEN条件に応じて値を返します。
  • 1️⃣ 単純なケース: シンプルな CASE は、1 つの式を値のリストと比較し、各 WHEN に対して等価性チェックを実行します。
  • 🔎 検索されたケース: Searched CASEは、各WHENに対して個別のブール式を評価し、範囲と不等号演算子をサポートします。
  • ➖ ELSEは省略可能です。 WHEN に一致するものがなく、ELSE が省略されている場合、CASE 式は NULL を返します。
  • 🪆 入れ子: CASE文は、別のCASE文の中やIF…ELSE文の中にネストすることができ、多段階のロジックを実現できます。
  • 🔧 SELECTを超えて: SELECTに加えて、CASEはUPDATE句やORDER BY句と連携して、条件付き更新や並べ替えを実行します。

SQL ServerにおけるCASE文とネストされたCASE文(T-SQLの例を含む)

現実の事件の概要!

繰り返しになりますが、現実生活では、さまざまな状況の結果に応じて、私たちは異なる行動をとります。さらに詳しく説明するために、以下の例を考えてみましょう。

  • 航空券が 100 ドル未満であれば、ロサンゼルスに行きます。
  • 航空券が100ドルから200ドルの間であれば、ニューヨークへ行きます。
  • 航空券が200ドルから400ドルの間であれば、ヨーロッパへ旅行に行きます。
  • そうでなければ、近くの観光地を訪れる方が良いでしょう。

上記の例から、状態と行動を別々に分類することを考えてみましょう。

条件 – 航空券 条件が真の場合にのみ実行されるアクション
Less $ 100より ロサンゼルスを訪問
間$ 100へ$ 200 ニューヨークを訪問
間$ 200へ$ 400 ヨーロッパを訪問
上記の条件がどれも満たされない 近くの観光スポット

上記の例では、さまざまな条件の結果が別々の行動を左右することがわかります。たとえば、訪問者は航空券が100ドルから200ドルの間の場合にのみニューヨークを訪れるという行動をとります。同様に、 MS SQL CASE文は、さまざまな条件の結果に基づいて、異なるT-SQL文を実行する機能も提供します。

SQL Server の CASE ステートメントとは何ですか?

CASE ステートメント SQLサーバー は、 もし…そうでなければ ステートメント。IF…ELSE では最大で 1 つの条件しか許可されませんが、CASE では、複数の条件を適用して MS SQL でさまざまなアクションを実行できます。ユーザーが定義した条件に関連付けられた対応する値が返されます。

CASEの使い方を学びましょう SQL そして、その概念については以下のセクションで説明します。MS SQLには、2種類のCASE文があります。

  • シンプルなケース
  • 検索されたケース

シンプルなケース

単純ケースの構文

CASE <Case_Expression>
     WHEN Value_1 THEN Statement_1
     WHEN Value_2 THEN Statement_2
     .
     .
     WHEN Value_N THEN Statement_N
     [ELSE Statement_Else]   
END AS [ALIAS_NAME]

ここに:

  • パラメータ Case_Expression は、最終的に Value_1、Value_2 などと比較される式を示します。
  • パラメータ Statement_1、Statement_2… は、Case_Expression = Value_1、Case_Expression = Value_2 などの場合に実行されるステートメントを示します。
  • 要するに、条件は Case_Expression = Value_N であるかどうかであり、上記の結果が TRUE の場合、アクションは Statement_N を実行することです。
  • ALIAS_NAMEは省略可能で、SQL ServerのCASE文の結果に付けられるエイリアス名です。主にSQL ServerのSELECT句でCASE文を使用する場合に使用されます。

単純なケースのルール

  • シンプルなケースでは、Case_Expression と Value_1 から Value_N の間の等価性チェックのみが許可されます。
  • Case_Expressionは、最初の値(Value_1)から順に、値と比較されます。実行方法は以下のとおりです。
  • Case_Expression が Value_1 と等しい場合、それ以降の WHEN…THEN ステートメントはスキップされ、CASE の実行は直ちに終了します。
  • Case_ExpressionがValue_1と一致しない場合、Case_ExpressionはValue_2と比較され、等価性が検証されます。Case_Expressionと値を比較するこのプロセスは、Case_ExpressionがValue_1、Value_2などのセットから一致する等価値を見つけるまで続きます。
  • 一致するものが何もない場合は、制御はELSE文に移り、Statement_Elseが実行されます。
  • ELSE はオプションです。
  • ELSE が存在せず、Case_Expression がどの値にも一致しない場合は、NULL が表示されます。

下の図は、単純なケースの実行フローを示しています。

シンプルなCASE文が各WHEN値を順番に評価する様子を示すフローチャート

例

'という名前のテーブルがあると仮定しますGuru以下に示すように、2 つの列 (Tutorial_ID と Tutorial_name) と 4 つの行を持つ 99 を使用します。Guru以下の例では、99' テーブルを使用します。

サンプル GuruTutorial_IDとTutorial_name列、4行のテーブル99

クエリ 1: NO ELSE オプションを使用した単純なケース

SELECT Tutorial_ID, Tutorial_name,
CASE Tutorial_name
	WHEN 'SQL' THEN 'SQL is developed by IBM'
	WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
END AS Description
FROM Guru99

結果:以下の図は、ELSE を含まない SIMPLE CASE の実行フローを示しています。

ELSE のない単純な CASE の結果、 Descript各チュートリアル名に対応するイオン

クエリ2:ELSEオプションを使用した単純なCASE文

SELECT Tutorial_ID, Tutorial_name,
CASE Tutorial_name
	WHEN 'SQL' THEN 'SQL is developed by IBM'
	WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

結果:以下の図は、ELSE を含む SIMPLE CASE の実行フローを示しています。

ELSE句を含む単純なCASE文の結果。一致しない行にはデフォルトのテキストが返されます。

検索されたケース

検索ケースの構文

CASE 
     WHEN <Boolean_Expression_1> THEN Statement_1
     WHEN <Boolean_Expression_2> THEN Statement_2
     .
     .
     WHEN <Boolean_Expression_N> THEN Statement_N
     [ELSE Statement_Else]   
END AS [ALIAS_NAME]

ここに:

  • パラメータ Boolean_Expression_1… は、TRUE または FALSE として評価される式を示します。
  • パラメータ Statement_1、Statement_2… は、対応する Boolean_Expression_1、Boolean_Expression_2 の結果が TRUE の場合に実行されるステートメントを示します。
  • 簡単に言うと、条件はブール式1…であり、上記のブール式1がTRUEの場合、アクションはステートメントNの実行です。
  • ALIAS_NAMEは省略可能で、CASE文の結果に付けられるエイリアス名です。主にSELECT句でCASEを使用する場合に使用されます。

検索されたケースのルール

  • 単純ケースとは異なり、検索ケースは等価性チェックのみに限定されず、ブール式も使用できます。
  • ブール式は、最初のブール式(Boolean_Expression_1)から順に評価されます。実行手順は以下のとおりです。
  • Boolean_Expression_1 が TRUE の場合、以降の WHEN…THEN ステートメントはスキップされ、CASE の実行は直ちに終了します。
  • Boolean_Expression_1 が FALSE の場合、Boolean_Expression_2 が TRUE 条件で評価されます。このブール式の評価プロセスは、いずれかのブール式が TRUE を返すまで続きます。
  • 一致するものが何もない場合は、制御はELSE文に移り、Statement_Elseが実行されます。
  • 単純ケースと同様に、検索ケースでもELSEは省略可能です。
  • ELSE が存在せず、かつどのブール式も TRUE を返さない場合は、NULL が表示されます。

以下の図は、検索対象ケースの実行フローを示しています。

検索CASEが各ブール式を順番に評価する様子を示すフローチャート

例

クエリ 1: NO ELSE オプションを使用した SEARCHED CASE

SELECT Tutorial_ID, Tutorial_name,
CASE 
 	WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM'
	WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
END AS Description
FROM Guru99

結果:以下の図は、ELSE なしの SEARCHED CASE の実行フローを示しています。

ELSE のない検索 CASE の結果、各 Tutorial_name を一致させて Descriptexpression CMS

クエリ2:ELSEオプションを使用した検索ケース

SELECT Tutorial_ID, Tutorial_name,
CASE 
	WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM'
	WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

結果:以下の図は、ELSE を含む SEARCHED CASE の実行フローを示しています。

ELSE句を含む検索CASEの結果。SQL以外の言語の場合はデフォルトテキストを返します。

実行アプローチの違い:SIMPLEとSEARCH CASE

以下に、単純なケースの例を示します。

SELECT Tutorial_ID, Tutorial_name,
CASE Tutorial_name
	WHEN 'SQL' THEN 'SQL is developed by IBM'
	WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

ここで、「Tutorial_name」はSQLのCASE式の一部です。そして、「Tutorial_name」の値は、各WHEN値(つまり「SQL」…)と比較され、「Tutorial_name」がWHEN値と一致するまで繰り返されます。

それとは対照的に、SEARCH CASEの例にはCASE式がありません。

SELECT Tutorial_ID, Tutorial_name,
CASE 
 	WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM'
	WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
END AS Description
FROM Guru99

ここでは、各WHEN文にそれぞれ条件付きブール式があります。各ブール式(例:Tutorial_name = 'SQL'…)は、TRUEと評価される最初のブール式が見つかるまで、TRUE/FALSEで評価されます。

単純ケースと検索ケースの違い

シンプルなケース 検索されたケース
CASEキーワードの直後にCASE式が続き、WHEN文の前に来ます。

例えば:
場合
WHEN 値_1 THEN ステートメント_1…

CASEキーワードの後に​​はWHEN文が続き、CASEとWHENの間には式は存在しません。

例えば:
ケース の場合そして、ステートメント1…

単純なケースでは、各WHEN文に対応する値が存在します。これらの値(Value_1、Value_2…)は、単一のCASE式と順次比較されます。その結果は、各WHEN文のTRUE/FALSE条件に基づいて評価されます。

例えば:
場合
WHEN 値_1 THEN ステートメント_1…
WHEN 値_2 THEN ステートメント_2…

検索ケースでは、各WHEN文に対してブール式が存在します。これらのブール式(ブール式1、ブール式2…)は、各WHEN文のTRUE/FALSE条件を評価します。

例えば:
HOUSES
いつTHEN ステートメント_1…
いつTHEN ステートメント_2…

シンプルなケースでは、等価性チェックのみをサポートします。つまり、CASE_Expression = VALUE_1、VALUE_2…

例えば:
場合WHEN Value_1 THEN Statement_1…
上記の例では、システムが行う唯一の操作は、Case_Expression = Value_1 かどうかを確認することです。

Boolean_Expression_N を使用すると、検索ケースはブール値を返すあらゆる演算をサポートします。これには、等号演算子と不等号演算子が含まれます。

例えば:
ケース の場合そして、ステートメント1…
上記の例では、Boolean_Expression_1 には、A = B、A != B のように、「等しい」演算子と「等しくない」演算子の両方を含めることができます。

ネストされた CASE: IF ELSE の CASE

IF…ELSE ステートメント内で CASE を使用できます。 変数 航空券を取得し、その値に基づいて分岐します。以下に、MS-SQLコードの例を示します。

DECLARE @Flight_Ticket int;
SET @Flight_Ticket = 190;
IF @Flight_Ticket > 400
   PRINT 'Visit Nearby Tourist Location';
ELSE 
BEGIN
    SELECT
	CASE 
	WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles'
	WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York'
	WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe'
	END AS Location	
END

上記の例では、IF…ELSE ステートメントの中に CASE がネストされています。まず IF ステートメントが実行され、SQL Server の CASE 条件が False の場合、ELSE ステートメントが実行されます。ELSE 部分には、SQL のネストされた CASE ステートメントが含まれています。航空券の値に応じて、次のいずれかの結果が表示されます。

  • 航空券の価格が400ドルを超える場合、システムは「近くの観光地を訪れる」と表示します。
  • 航空券の価格が0ドルから100ドルの間であれば、システムは「ロサンゼルスへ行こう」と印刷します。
  • 航空券の価格が101ドルから200ドルの間であれば、システムは「ニューヨークへ行こう」と印刷します。
  • 航空券の価格が201ドルから400ドルの間であれば、システムは「ヨーロッパへ行こう」と印刷します。

以下の結果は、ネストされたCASE文がELSE分岐内で実行されたときに返される場所を示しています。

IF…ELSEの中にネストされたCASE文の結果、チケットの訪問場所が出力されます。

ネストされた CASE: CASE 内の CASE

SQLでは、CASE文の中に別のCASE文を使用できます。以下にMS-SQLのコード例を示します。

DECLARE @Flight_Ticket int;
SET @Flight_Ticket = 250;
SELECT
CASE 
WHEN @Flight_Ticket >= 400 THEN 'Visit Nearby Tourist Location.'
WHEN @Flight_Ticket < 400 THEN 
    	CASE 
		WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles'
		WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York'
		WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe'
		END	
END AS Location

上記の例では、CASE文が別のCASE文の中にネストされています。システムはまず外側のCASE文を実行し、Flight_Ticketが400ドル未満の場合、内側のCASE文が実行されます。返される場所は前の例と同じチケット価格帯に従うため、250ドルのチケットは201ドル~400ドルの範囲に該当し、「ヨーロッパへ旅行」が返されます。

以下に、250ドルのチケットに対して内部CASEが返した場所を示します。

別の CASE の中にネストされた CASE の結果、250 チケットで Visit Europe が返されます

アップデートのあるケース

再び、私たちは「Guru以下に示すような、2列4行の99'表:

GuruCASE UPDATE前の99テーブルには、元のTutorial_Nameの値が表示されています。

UPDATE とともに CASE を使用できます。 以下は MS-SQL コードの例です。

UPDATE Guru99
SET Tutorial_Name = 
	(
	CASE
	WHEN Tutorial_Name = 'SQL' THEN 'Structured Query language.'
	WHEN Tutorial_Name = 'PL/SQL' THEN 'Oracle PL/SQL'
	WHEN Tutorial_Name = 'MSSQL' THEN 'Microsoft SQL.'
	WHEN Tutorial_Name = 'Hadoop' THEN 'Apache Hadoop.'
	END
	)

上記の例では、UPDATE文でCASE文が使用されています。Tutorial_Nameの値に応じて、Tutorial_Name列はTHEN文の値で更新されます。

  • Tutorial_Nameが「SQL」の場合は、Tutorial_Nameを「構造化クエリ言語」に更新します。
  • Tutorial_Name が 'PL/SQL' の場合、Tutorial_Name を ' に更新します。Oracle PL/SQL'。
  • Tutorial_Name = 'MSSQL' の場合、Tutorial_Name を ' に更新します。Microsoft SQL'。
  • Tutorial_Nameが「Hadoop」の場合、Tutorial_Nameを「Apache Hadoop」に更新します。

このステートメントを実行すると、以下に示すように、一致する行が更新されます。

CASE UPDATE ステートメントの実行結果 Guru99テーブル

を照会してみましょう。Guru更新された値を確認するための99'テーブル:

GuruCASE UPDATE後の99テーブルには、新しいTutorial_Nameの値が表示されています。

注文者によるケース

ORDER BY句とCASE句を組み合わせることができます。以下にMS-SQLのコード例を示します。

Declare @Order Int;
Set @Order = 1
Select * from Guru99 order by 
CASE 
	WHEN @Order = 1 THEN Tutorial_ID
	WHEN @Order = 2 THEN Tutorial_Name
	END
DESC

ここでは、CASE文がORDER BY句と共に使用されています。@Orderは1に設定され、最初のWHENブール式がTRUEと評価されるため、ORDER BY条件としてTutorial_IDが選択されます。結果は以下のとおりです。

ORDER BY と CASE 式によるソートの結果 GuruチュートリアルIDによる99の表

興味深い事実!

  • CASE文は、別のCASE文の中だけでなく、IF…ELSE文の中にも入れ子にすることができます。
  • SELECTに加えて、CASEはUPDATEやORDER BYなどの他のSQL句でも使用できます。

よくあるご質問

IIF() は、2 つの結果を返す CASE 式の省略形です。条件が真の場合は 1 つの値、偽の場合は別の値を返します。完全な CASE 式はより柔軟性があり、1 つのステートメントで複数の WHEN 条件をテストできます。

はい。CASEは値を返すため、SELECTリスト、WHERE句、HAVING句、GROUP BY句で使用できます。WHERE句では、CASEを使用することで、他の列の値に応じて異なるフィルタリングロジックを適用できます。

はい。SUM()、COUNT()、またはCASE式を内部に配置すると、 AVG() は条件付き集計を実行し、各 WHEN 条件に一致する行のみを合計またはカウントします。この手法は、ピボット形式のサマリー レポートを作成する際によく使用されます。

COALESCEとISNULLは、リストからNULL以外の最初の値のみを返します。CASE式はより広範で、任意のブール条件または値の一致を評価し、最初に真となった分岐の結果を返します。

CASE式は単一のデータ型を返します。SQL Serverは、すべてのTHENおよびELSEの結果のデータ型の優先順位に基づいてそれを決定するため、変換エラーを回避するには、すべての分岐で互換性のある型を返す必要があります。

はい。CASE式は、ビューのSELECT文内だけでなく、ストアドプロシージャ、関数、トリガー内のどこにでも記述できます。これらのオブジェクトすべてにおいて、同じ式構文が機能します。

Yes. GitHubコパイロット 自然言語プロンプトから、単純CASE式と検索CASE式(ネストされたCASE式やUPDATE文内のCASE式を含む)を作成できます。クエリを実行する前に、必ずWHEN条件、分岐順序、およびELSE処理を確認してください。

AIと機械学習アシスタントは、平易な英語のルールをシンプルなCASE式または検索されたCASE式に変換し、不足しているWHEN分岐を提案し、重複を指摘します。ping または到達不可能な条件。開発者は、提案をデプロイする前に、それぞれの提案の正当性を確認します。