NULL 値の検索
IS NULL 比較演算子
NULL 値は WHERE colname = NULL のような条件では NULL のレコードを抽出することはできない。
SQL> set null '<NULL>'
SQL> select * from null_test;
COL
------
A
<NULL>
C
SQL> select * from null_test where col = null;
レコードが選択されませんでした。
参考 ⇒ set null '<NULL>'
NULL 値を抽出するには IS NULL を使用する。
SQL> select * from null_test where col IS NULL;
COL
------
<NULL>
NULL 値 以外 を抽出するには IS NOT NULL を使用する。
IS NULL は関数ではないので NOT IS NULL とは書かない
SQL> select * from null_test where col IS NOT NULL;
COL
------
A
C
NOT を使う場合には
SQL> select * from null_test where NOT col IS NULL;
COL
------
A
C
NULL とWHERE 条件
val の値 | 条件式 | 比較の結果 |
NULL | val IS NULL | TRUE |
val IS NOT NULL | FALSE |
val の値 | 条件式 | 比較の結果 |
10 | val IS NULL | FALSE |
'abc' | FALSE |
10 | val IS NOT NULL | TRUE |
'abc' | TRUE |
val の値 | 条件式 | 比較の結果 |
NULL | val = NULL | UNKNOWN (TRUE でも FALSEで もない) |
NOT val = NULL |
val = 10 | UNKNOWN (TRUE でも FALSEで もない) |
NOT val = 10 |
val <> 10 |
NOT val <> 10 |
val = 'abc' |
NOT val = 'abc' |
val の値 | 条件式 | 比較の結果 |
NULL | val IN ( 1, 2, 3) | UNKNOWN (TRUE でも FALSEで もない) |
val NOT IN ( 1, 2, 3) |
val IN ( NULL, 2, 3) |
val NOT IN ( NULL, 2, 3) |
val IN ( 'a', 'b', 'c') |
val NOT IN ( 'a', 'b', 'c') |
val IN ( NULL, 'b', 'c') |
val NOT IN ( NULL, 'b', 'c') |
IS NULL は SELECT 項目にあまり使用しない
SQL> select case when col IS NULL then 'NULL' else 'NOT NULL' end from null_test;
CASEWHEN
--------
NOT NULL
NULL
NOT NULL
同じことは NVL2 関数 で記述可能
SQL> select nvl2(col, 'NOT NULL', 'NULL') from null_test;
NVL2(COL
--------
NOT NULL
NULL
NOT NULL
他にも NVL 関数、COALESCE 関数 や NULLIF 関数 などもある。
DECODE 関数 も NULL を取り扱える。
関連事項