- カテゴリ:
 
CASE¶
カスケードの「if-then-else」ステートメントのように機能します。より一般的な形式では、一連の条件が順番に評価されます。条件が TRUEに評価されると評価は停止し、関連する結果( THENの後)が返されます。いずれの条件も TRUEに評価されない場合、オプションの ELSE の後の結果が返されます(存在する場合)。それ以外の場合は、 NULL が返されます。
2番目の「簡略」形式では、 CASE の後の式は、1つが一致するまで、順番に各 WHEN 式と比較されます。その後、関連する結果( THENの後)が返されます。どの式も一致しない場合、オプションの ELSE の後の結果が返されます(存在する場合)。それ以外の場合は、 NULL が返されます。
2番目の形式では、 WHEN 式のいずれかが NULLであっても、 NULL CASE 式 WHEN 式のいずれにも一致しません。
- こちらもご覧ください:
 
構文¶
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
引数¶
condition#CASEの最初の形式では、各条件は BOOLEAN 値(True、False、または NULL)に評価される式です。expr一般的な式です。
valueCASEの2番目の形式では、各valueはexprと一致する可能性があります。valueは、リテラルまたは式です。valueは、exprと同じデータ型であるか、exprのデータ型にキャストできるデータ型である必要があります。result#CASE句の最初の形式で、condition#がtrueの場合、関数は対応するresult#を返します。複数の条件が真の場合、最初の真の条件に関連付けられた結果が返されます。CASEステートメントの2番目の形式では、value#がexprと一致する場合、対応するresultが返されます。複数のvalueがexprと一致する場合は、最初に一致する値のresultが返されます。結果は、単一の値に評価される式でなければなりません。
CASEの両方の形式でオプションのELSE句が存在し、一致するものが見つからない場合、関数はELSE句で結果を返します。ELSE句が存在せず、一致するものが見つからない場合、結果は NULLになります。
使用上の注意¶
DECODE とは異なり、条件内の NULL 値は条件内の他の場所の NULL 値とは 一致しません。たとえば、
WHEN <null式> = NULL THEN 'Return me!'は「Return me!」を返しません。NULL 値と比較する場合は、= NULLではなくIS NULLを使用します。condition#、expr、value、resultはすべて一般式であるため、UNION、INTERSECT、EXCEPT、MINUSなどのセット演算子を含むサブクエリを含めることができます。セット演算子を使用する場合は、データ型に互換性があることを確認してください。詳細については、 演算子のセット トピックの 一般的な使用上の注意 をご参照ください。
照合順序の詳細¶
CASE の最初の形式では、各式は独立しており、異なるブランチの照合仕様は独立しています。たとえば、以下では condition1 の照合仕様は condition2 の照合仕様から独立しており、それらの照合仕様は同一である必要はなく、互換性さえ必要ありません。
CASE
    WHEN <condition1> THEN <result1>
  [ WHEN <condition2> THEN <result2> ]
CASE の2番目の形式では、すべての照合関連操作で互換性のある照合仕様を使用する必要がありますが、照合仕様は同一である必要はありません。たとえば、次のステートメントでは、 value1 と value2 の両方の照合仕様は expr の照合仕様と互換性がなければなりませんが、 value1 と value2 は、相互に同一、または expr の照合仕様と同一である必要はありません。
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                                     |
+------------------------------------------+