SQL Server の CASE ステートメントと入れ子になったケース: T-SQL の例
⚡ スマートサマリー
CASEはSQL Serverの条件式で、最初に真と評価された条件に基づいて値を返します。シンプル形式と検索形式があり、IF…ELSE、UPDATE、ORDER BYの中にネストすることもできます。
現実の事件の概要!
繰り返しになりますが、現実生活では、さまざまな状況の結果に応じて、私たちは異なる行動をとります。さらに詳しく説明するために、以下の例を考えてみましょう。
- 航空券が 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 が表示されます。
下の図は、単純なケースの実行フローを示しています。
例
'という名前のテーブルがあると仮定しますGuru以下に示すように、2 つの列 (Tutorial_ID と Tutorial_name) と 4 つの行を持つ 99 を使用します。Guru以下の例では、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 の実行フローを示しています。
クエリ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 の実行フローを示しています。
検索されたケース
検索ケースの構文
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 が表示されます。
以下の図は、検索対象ケースの実行フローを示しています。
例
クエリ 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 の実行フローを示しています。
クエリ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 の実行フローを示しています。
実行アプローチの違い: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文の前に来ます。
例えば: |
CASEキーワードの後にはWHEN文が続き、CASEとWHENの間には式は存在しません。
例えば: |
| 単純なケースでは、各WHEN文に対応する値が存在します。これらの値(Value_1、Value_2…)は、単一のCASE式と順次比較されます。その結果は、各WHEN文のTRUE/FALSE条件に基づいて評価されます。
例えば: |
検索ケースでは、各WHEN文に対してブール式が存在します。これらのブール式(ブール式1、ブール式2…)は、各WHEN文のTRUE/FALSE条件を評価します。
例えば: |
| シンプルなケースでは、等価性チェックのみをサポートします。つまり、CASE_Expression = VALUE_1、VALUE_2…
例えば: |
Boolean_Expression_N を使用すると、検索ケースはブール値を返すあらゆる演算をサポートします。これには、等号演算子と不等号演算子が含まれます。
例えば: |
ネストされた 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分岐内で実行されたときに返される場所を示しています。
ネストされた 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が返した場所を示します。
アップデートのあるケース
再び、私たちは「Guru以下に示すような、2列4行の99'表:
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」に更新します。
このステートメントを実行すると、以下に示すように、一致する行が更新されます。
を照会してみましょう。Guru更新された値を確認するための99'テーブル:
注文者によるケース
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が選択されます。結果は以下のとおりです。
興味深い事実!
- CASE文は、別のCASE文の中だけでなく、IF…ELSE文の中にも入れ子にすることができます。
- SELECTに加えて、CASEはUPDATEやORDER BYなどの他のSQL句でも使用できます。














