ソースコードから寄せ集めたSQLが同じnull判定をいろんなパターンで行っていて、面白かったのでメモ
下記のコード(パターン4以外)は、col_name
の値が null
であれば 0
、null
以外であれば 1
を返却している。
Oracle 11gにて検証
パターン1: NVL2関数 を使う
SELECT
NVL2(col_name, 1, 0) AS null_flg
FROM
table_name
NVL2 ( expr1 , expr2 , expr3 )
戻り値:
式 expr1 が NULL 以外なら 式 expr2 の値(expr1 の型)
式 expr1 が NULL なら 式 expr3 の値(expr3 の型)
NVL2、NULLIF - オラクル・Oracle SQL 関数リファレンス
パターン2: DECODE関数 を使う
SELECT
DECODE(col_name, NULL, 0, 1) AS null_flg
FROM
table_name
パターン3: 検索CASE式 を使う
SELECT
CASE
WHEN col_name IS NULL THEN 0
ELSE 1
END AS null_flg
FROM
table_name
パターン4: 単純CASE式 を使う(と、できないので注意!)
SELECT
CASE col_name
WHEN NULL THEN 0
ELSE 1
END AS null_flg
FROM
table_name
これは col_name
が NULL
であっても、1
が返却されるため、間違ったパターン。
理由については以下を参照 ↓
単純 CASE 式は NULL との評価はすべて NULL になる。
CASE と DECODE 関数の違い - オラクル・Oracleをマスターするための基本と仕組み