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

現実の事件の概要!

繰り返しになりますが、現実の生活では、さまざまな条件の結果に応じて、さまざまなアクションを実行します。

さらに詳しく説明するには、以下の例を考えてみましょう。

  • 航空券が 100 ドル未満であれば、ロサンゼルスに行きます。
  • 航空券が 100 ドルから 200 ドルの間であれば、ニューヨークに行きます
  • 航空券が200ドルから400ドルの間であれば、ヨーロッパに行きます
  • それ以外の場合は、近くの観光スポットを訪れたいと思います。

上記の例とは別に、以下の条件とアクションを分類して考えてみましょう。

条件 – フライトチケット 実行されたアクション、条件が次の場合のみ TRUE
$ 100未満 ロサンゼルスを訪問
間$ 100へ$ 200 ニューヨークを訪問
間$ 200へ$ 400 ヨーロッパを訪問
上記の条件がどれも満たされない 近くの観光スポット

上の例では、さまざまな条件の結果が個別のアクションを制御していることがわかります。 例えば、訪問者は航空券が100ドルから200ドルの間であるという条件でのみニューヨークを訪問する行為を行うことになります。

同様に、MS SQL CASE ステートメントは、さまざまな条件の結果に基づいてさまざまな T-SQL ステートメントを実行するアクションを実行する機能も提供します。

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

SQL Server の CASE ステートメント IF…ELSE文の拡張です。 最大 XNUMX つの条件のみが許可される IF…ELSE とは異なり、CASE ではユーザーが複数の条件を適用して、MS SQL のさまざまなアクションのセットを実行できます。 ユーザーが定義した条件に関連付けられた対応する値を返します。

SQL で Case を使用する方法とその概念を以下で学びましょうwing セクション。

In MS SQL, CASEにはXNUMX種類あります。

  1. シンプルなケース
  2. 検索されたケース

シンプルなケース

シンプルケースの構文

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]

ここでは、

  • パラメータ ケース式 最終的に比較される式を示します 値_1、値_2、...
  • パラメータ ステートメント_1、ステートメント_2… Case_Expression の場合に実行されるステートメントを示します。 = 値_1、ケース_式 = Value_2、…など。
  • 一言で言えば、 条件 Case_Expression かどうかです。 = Value_N および ACTION は、Statement_N の実行です。 上記の結果は TRUE です.
  • ALIAS_NAME はオプションで、SQL Server CASE ステートメントの結果に指定されるエイリアス名です。 SQL サーバーの select 句で Case を使用するときに主に使用されます。

単純なケースのルール

  • Simple Case では、Value_1 から Value_N までの Case_Expression の等価性チェックのみが可能です。
  • Case_Expression と Value は、最初の値 (Value_1) から順に比較されます。 以下は実行アプローチです。
  • Case_Expression が Value_1 と等しい場合、それ以降の WHEN…THEN ステートメントはスキップされ、CASE の実行は直ちに終了します。
  • Case_Expression が Value_1 と一致しない場合は、Case_Expression が Value_2 と比較されて同等かどうかが確認されます。 Case_Expression と Value を比較するこのプロセスは、Case_Expression が Value_1、Value_2、... のセットから一致する同等の値を見つけるまで継続されます。
  • 一致するものがない場合、制御は ELSE ステートメントに移り、Statement_Else が実行されます。
  • ELSE はオプションです。
  • ELSE が存在せず、Case_Expression がどの値とも一致しない場合、 Nullが表示されます。

以下の図は、Simple Case の実行フローを示しています。

単純な Case ステートメントの仕組み
単純な Case ステートメントの仕組み

仮定: 次のようなテーブルがあると仮定します。 「グル99」 以下に示すように、XNUMX 列 XNUMX 行で構成されます。

SQL Server の単純なケース

我々は使用するだろう 「グル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

結果: 以下の図は、NO ELSE を指定した SIMPLE CASE の実行フローを説明しています。

SQL Server の単純なケース

クエリ 2: 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.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

結果: 以下の図は、ELSE を使用した SIMPLE CASE の実行フローを説明しています。

SQL Server の単純なケース

検索されたケース

検索されたケースの構文

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 の場合に実行されるステートメントを示します。
  • 簡単に言うと、Condition は Boolean_Expression_1,… で、ACTION は上記の boolean_Expression_1 が TRUE の場合の Statement_N の実行です。
  • ALIAS_NAME はオプションで、CASE ステートメントの結果に指定される別名です。 主に、select 句で CASE を使用するときに使用されます。

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

  • 単純なケースとは異なり、Searched Case は等価性チェックのみに制限されず、ブール式も可能です。
  • ブール式は、最初のブール式 (Boolean_expression_1) から順に評価されます。 以下は実行アプローチです。
    • Boolean_expression_1 が TRUE の場合、それ以降の WHEN…THEN ステートメントはスキップされ、CASE の実行は直ちに終了します。
    • Boolean_expression_1 が FALSE の場合、Boolean_expression_2 は TRUE 条件として評価されます。 Boolean_expression を評価するこのプロセスは、いずれかの Boolean_expression が TRUE を返すまで続行されます。
    • 一致するものがない場合、制御は ELSE ステートメントに移り、Statement_Else が実行されます。
  • Simple Case と同様に、検索ケースでも ELSE はオプションです。
  • ELSE が存在せず、どの Boolean_expression も TRUE を返さない場合は、Null が表示されます。

以下の図 の実行フローを示します。 検索されたケース.

検索されたケースステートメントの働き

検索されたケースステートメントの働き

クエリ 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

結果: 下図 実行フローを説明します 検索されたケース   他にはありません。

SQL Server で検索された CASE の例

クエリ 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

結果: 下図 実行フローを説明します of 検索された事件   それ以外。

SQL Server で検索された CASE

実行アプローチの違い: 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

ここでは、 'チュートリアル名' SQLのCASE式の一部です。 それから 'チュートリアル名' それぞれの値を比較します WHEN 値、 つまり、「SQL」…「Tutorial_name」が WHEN 値と一致するまで。

それどころか、 ケースの検索 例にはありません 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.

単純なケースと検索されたケースの違い

シンプルなケース 検索されたケース
CASE キーワードの直後、および WHEN ステートメントの前に CASE_Expression が続きます。

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

Case キーワードの後に​​ WHEN ステートメントが続きますが、CASE と WHEN の間に式はありません。

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

単純なケースでは、WHEN ステートメントごとに VALUE が存在します。 この値: Value_1、Value_2… は単一の CASE_Expression と順番に比較されます。 結果は、各 WHEN ステートメントの TRUE/FALSE 条件で評価されます。

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

Searched Caseでは、WHEN文ごとにBoolean_Expressionが存在します。 この Boolean_Expressions: Boolean_Expression_1、Boolean_Expression_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 を使用すると、Search Case はブール値をもたらすあらゆる操作をサポートします。 これには、等しい演算子と等しくない演算子が含まれます。

例えば:
場合THEN Statement_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

上記の例では、CASE は IF…ELSE ステートメント内で NESTED です。

まず、IF ステートメントが実行され、if Case 条件が実行されます。 SQLサーバー False の場合、ELSE ステートメントが実行されます。

それ以外の場合は、SQL 内にネストされた CASE ステートメントが含まれます。 航空券の金額に応じて、次のいずれかwing 結果が表示されます:

  • 航空券が $400 を超える場合、システムは「近くの観光地に行く」と印刷します。
  • 航空券が $0 から $100 までの場合、システムは「Visit Los Angeles」と印刷します。
  • 航空券が $101 から $200 までの場合、システムは「Visit New York」と印刷します。
  • 航空券が $201 から $400 までの場合、システムは「Visit Europe」と印刷します。

SQL Server の入れ子になった 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 ステートメント内で NESTED されています。

システムは外側の CASE の実行から始まります。 Flight_Ticket < $400 の場合、内部 CASE が実行されます。

航空券の金額に応じて、次のいずれかwing 結果が表示されます:

  • 航空券が $400 を超える場合、システムは「近くの観光地に行く」と印刷します。
  • 航空券が $0 から $100 までの場合、システムは「Visit Los Angeles」と印刷します。
  • 航空券が $101 から $200 までの場合、システムは「Visit New York」と印刷します。
  • 航空券が $201 から $400 までの場合、システムは「Visit Europe」と印刷します。

SQL Server の入れ子になった CASE の例

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

仮定: 以下に示すように、99 つの列と XNUMX つの行を持つ「GuruXNUMX」というテーブルがあると仮定します。

SQL Server での UPDATE を含む CASE

さらなる例では「Guru99」テーブルを使用します

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' に更新します

SQL Server での UPDATE を含む CASE

Guru99 テーブルにクエリを実行して、更新された値を確認してみましょう。

SQL Server での UPDATE を含む CASE

注文者によるケース

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 と評価されると、Tutorial_ID が Order by Condition に選択されます。

SQL Server の Order by を使用した CASE

興味深い事実!

  • CASE は、別の CASE および別の IF…ELSE ステートメント内にネストできます。
  • SELECT に加えて、CASE は別のものと併用できます。 SQL UPDATE、ORDER BY などの句。

まとめ

  • MS SQL には、単純 CASE と検索 CASE の XNUMX 種類の CASE があります。
  • ELSE は CASE ステートメントではオプションです。