ANSI SQL:2011規格では、CASE式および関連する式のCOALESCEとNULLIFは、NULLを戻す能力を持つと指定されています。
NULLとCASE式
CASE、NULLIF、およびCOALESCE式におけるnull使用のルールは、次のとおりです。
- ELSE句がCASE式で指定されていない場合、評価がすべてのWHEN句を通過すると、結果はnullになります。
- nullとnullを含む式は、値形式のCASE式内のvalue_expression_1として有効です。
次の例は有効です。
SELECT CASE NULL WHEN 10 THEN 'TEN' END; SELECT CASE NULL + 1 WHEN 10 THEN 'TEN' END;
上記の例ではELSE句が指定されていないので、どちらの例もNULLを戻します。また、NULLはどの値ともまたはNULLとも等しくないので、評価はWHENになります。
- 任意の値またはNULLに対してNULLを比較すると、常にFALSEになります。NULLに関するテストでは、WHEN条件内でIS NULLまたはIS NOT NULLを使用する検索形式のCASE式を使うのが最善です。
次の例は有効です。
SELECT CASE WHEN column_1 IS NULL THEN 'NULL' END FROM table_1;
多くの場合Teradata Databaseは、常にNULLと評価される式が他の式またはNULLと比較された場合にそれを検出できるので、エラーを示して、IS NULLまたはIS NOT NULLの使用を推奨します。ANSI SQLでは、これをエラーとは判断しませんが、ユーザーがこの方法でのNULLの比較を意図することはほとんどないため、Teradata Databaseではエラーがレポートされることに注意してください。
次の例は無効です。
SELECT CASE column_1 WHEN NULL THEN 'NULL' END FROM table_1; SELECT CASE column_1 WHEN NULL + 1 THEN 'NULL' END FROM table_1; SELECT CASE WHEN column_1 = NULL THEN 'NULL' END FROM table_1; SELECT CASE WHEN column_1 = NULL + 1 THEN 'NULL' END FROM table_1;
- nullおよびnullを含む式は、THEN句の式として有効です。
次の例は有効です。
SELECT CASE WHEN column_1 = 10 THEN NULL END FROM table_1
上記の例とは異なり、このTHEN句内のNULLはSQLキーワードであり文字リテラルの値ではないことに注意してください。