カテゴリ:

条件式関数

CASE

カスケードの「if-then-else」ステートメントのように機能します。より一般的な形式では、一連の条件が順番に評価されます。条件が TRUEに評価されると評価は停止し、関連する結果( THENの後)が返されます。いずれの条件も TRUEに評価されない場合、オプションの ELSE の後の結果が返されます(存在する場合)。それ以外の場合は、 NULL が返されます。

2番目の「簡略」形式では、 CASE の後の式は、1つが一致するまで、順番に各 WHEN 式と比較されます。その後、関連する結果( THENの後)が返されます。どの式も一致しない場合、オプションの ELSE の後の結果が返されます(存在する場合)。それ以外の場合は、 NULL が返されます。

2番目の形式では、 WHEN 式のいずれかが NULLであっても、 NULL CASE 式 WHEN 式のいずれにも一致しません。

こちらもご覧ください

IFF

構文

CASE
    WHEN <condition1> THEN <result1>
  [ WHEN <condition2> THEN <result2> ]
  [ ... ]
  [ ELSE <result3> ]
END

CASE <expr>
    WHEN <value1> THEN <result1>
  [ WHEN <value2> THEN <result2> ]
  [ ... ]
  [ ELSE <result3> ]
END

引数

条件#

CASE の最初の形式では、各条件は BOOLEAN 値(True、False、または NULL)に評価される式です。

一般的な式です。

CASE の2番目の形式では、各 value と一致する可能性があります。 は、リテラルまたは式です。 は、 と同じデータ型であるか、 のデータ型にキャストできるデータ型である必要があります。

結果#

CASE 句の最初の形式で、 条件# が真の場合、関数は対応する 結果# を返します。複数の条件が真の場合、最初の真の条件に関連付けられた結果が返されます。

CASE ステートメントの2番目の形式では、 値# と一致する場合、対応する 結果 が返されます。複数の と一致する場合、最初に一致する値の 結果 が返されます。

結果は、単一の値に評価される式でなければなりません。

CASE の両方の形式でオプションの ELSE 句が存在し、一致するものが見つからない場合、関数は ELSE 句で結果を返します。 ELSE 句が存在せず、一致するものが見つからない場合、結果は NULLになります。

使用上の注意

  • DECODE とは異なり、条件内の NULL 値は条件内の他の場所の NULL 値とは 一致しません。例えば、 WHEN <null_expr> = NULL THEN 'Return me!' は「Return me!」を返しません。NULL 値と比較する場合は、 = NULL ではなく IS NULL を使用します。

  • 条件#結果 はすべて一般式であるため、 UNIONINTERSECTEXCEPTMINUS などのセット演算子を含むサブクエリを含めることができます。セット演算子を使用する場合は、データ型に互換性があることを確認してください。詳細については、 集合演算子 トピックの 一般的な使用上の注意 をご参照ください。

照合の詳細

CASE の最初の形式では、各式は独立しており、異なるブランチの照合仕様は独立しています。例えば、以下では 条件1 の照合仕様は 条件2 の照合仕様から独立しており、それらの照合仕様は同一である必要はなく、互換性さえありません。

CASE
    WHEN <condition1> THEN <result1>
  [ WHEN <condition2> THEN <result2> ]

CASE の2番目の形式では、すべての照合関連操作で互換性のある照合仕様を使用する必要がありますが、照合仕様は同一である必要はありません。例えば、次のステートメントでは、 値1値2 の両方の照合仕様は の照合仕様と互換性がなければなりませんが、 値1値2 は、相互にまたは の照合仕様と同一である必要はありません。

CASE <expr>
    WHEN <value1> THEN <result1>
  [ WHEN <value2> THEN <result2> ]
  ...

関数から返された値には、 THEN/ELSE 引数の最高の 優先順位 照合があります。

これは、 CASE の一般的な使用方法を示しています。

SELECT
    column1,
    CASE
        WHEN column1=1 THEN 'one'
        WHEN column1=2 THEN 'two'
        ELSE 'other'
    END AS result
FROM (values(1),(2),(3)) v;

出力:

+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
|       1 | one    |
|       2 | two    |
|       3 | other  |
+---------+--------+

これは、一致する値がなく、 ELSE 句がない場合、返される値は NULLであることを示しています。

SELECT
    column1,
    CASE
        WHEN column1=1 THEN 'one'
        WHEN column1=2 THEN 'two'
    END AS result
FROM (values(1),(2),(3)) v;

出力:

+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
|       1 | one    |
|       2 | two    |
|       3 | NULL   |
+---------+--------+

この例では、 NULL を明示的に処理します。

SELECT
    column1,
    CASE 
        WHEN column1 = 1 THEN 'one'
        WHEN column1 = 2 THEN 'two'
        WHEN column1 IS NULL THEN 'NULL'
        ELSE 'other'
    END AS result
FROM VALUES (1), (2), (NULL);

出力:

+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
|       1 | one    |
|       2 | two    |
|    NULL | NULL   |
+---------+--------+

次の例では、 CASE と照合を組み合わせています。

SELECT CASE COLLATE('m', 'upper')
    WHEN 'M' THEN TRUE
    ELSE FALSE
END;
+----------------------------+
| CASE COLLATE('M', 'UPPER') |
|     WHEN 'M' THEN TRUE     |
|     ELSE FALSE             |
| END                        |
|----------------------------|
| True                       |
+----------------------------+
SELECT CASE 'm'
    WHEN COLLATE('M', 'lower') THEN TRUE
    ELSE FALSE
END;
+------------------------------------------+
| CASE 'M'                                 |
|     WHEN COLLATE('M', 'LOWER') THEN TRUE |
|     ELSE FALSE                           |
| END                                      |
|------------------------------------------|
| True                                     |
+------------------------------------------+