- カテゴリ:
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
一般的な式です。
value
CASE
の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 | +------------------------------------------+