例えばDB上で「削除フラグ」という項目があり、この「削除フラグ」が0, 1, NULLの3通りの値を取り得る状態で、「削除フラグが1でないデータ」を取得する場合、「削除フラグ != 1」という条件を指定するとNULLのデータが取得されないので注意が必要である。
今回は、Oracleデータベース上で、「削除フラグが1でないデータ」を取得してみたので、そのSQLを共有する。
前提条件
Oracle上で下記記事の「EMPLOYEE」テーブルが作成済であること。

各DB上で特定の日付とシステム日付の1ヶ月前の日付を比較してみたDBから特定の日付がシステム日付以降(1ヶ月以内)のデータを取得しようとした時に、日付の大小関係が分からなくなってしまったことがあった。...
実行結果
Oracleの場合の実行結果は、以下の通り。なお、他のMySQL、PostgreSQL、SQL Serverの場合も同じ結果になるため、今回はOracleの場合のみ共有する。
1) 削除フラグをEMPLOYEEテーブルに追加する。
ALTER TABLE EMPLOYEE ADD ( DEL_FLG CHAR(1) );

実行後のデータの内容は、以下の通り。
SELECT * FROM EMPLOYEE

2) 一部データの削除フラグの値を、0または1に更新する。
UPDATE EMPLOYEE SET DEL_FLG = '0' WHERE ID = 1; UPDATE EMPLOYEE SET DEL_FLG = '1' WHERE ID = 2; COMMIT;

実行後のデータの内容は、以下の通り。
SELECT * FROM EMPLOYEE

3) 削除フラグが1でないデータを「削除フラグ != 1」という条件をつけて検索すると、削除フラグがNULLのデータが取得されないことが確認できる。
SELECT * FROM EMPLOYEE WHERE DEL_FLG != '1'

4) 削除フラグが1でないデータを「削除フラグ != 1 OR 削除フラグ IS NULL」という条件をつけて検索すると、NULLを含め、削除フラグが1でないデータが取得されることが確認できる。
SELECT * FROM EMPLOYEE WHERE DEL_FLG != '1' OR DEL_FLG IS NULL

5) 「削除フラグ = 0 OR 削除フラグ IS NULL」という条件をつけて検索した場合も、同じデータが取得されることが確認できる。
SELECT * FROM EMPLOYEE WHERE DEL_FLG = '0' OR DEL_FLG IS NULL

要点まとめ
- 「削除フラグ」が0, 1, NULLの3通りの値を取り得る状態で、「削除フラグが1でないデータ」を取得する場合、「削除フラグ != 1」という条件を指定するとNULLのデータが取得されない。NULLのデータを取得するには、「OR 削除フラグ IS NULL」という条件を追加する必要がある。