カテゴリ:

条件式関数

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
Copy

引数

condition#

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

expr

一般的な式です。

value

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

result#

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

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

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

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

使用上の注意

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

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

照合の詳細

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

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

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

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

関数から返された値には、 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;
Copy

出力:

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

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

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

出力:

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

この例では、 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);
Copy

出力:

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

次の例では、 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                                     |
+------------------------------------------+
Copy