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 を取り扱える。
関連事項