例えば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テーブルに追加する。
1 | ALTER TABLE EMPLOYEE ADD ( DEL_FLG CHAR(1) ); |
実行後のデータの内容は、以下の通り。
1 | SELECT * FROM EMPLOYEE |
2) 一部データの削除フラグの値を、0または1に更新する。
1 2 3 | UPDATE EMPLOYEE SET DEL_FLG = '0' WHERE ID = 1; UPDATE EMPLOYEE SET DEL_FLG = '1' WHERE ID = 2; COMMIT; |
実行後のデータの内容は、以下の通り。
1 | SELECT * FROM EMPLOYEE |
3) 削除フラグが1でないデータを「削除フラグ != 1」という条件をつけて検索すると、削除フラグがNULLのデータが取得されないことが確認できる。
1 2 | SELECT * FROM EMPLOYEE WHERE DEL_FLG != '1' |
4) 削除フラグが1でないデータを「削除フラグ != 1 OR 削除フラグ IS NULL」という条件をつけて検索すると、NULLを含め、削除フラグが1でないデータが取得されることが確認できる。
1 2 | SELECT * FROM EMPLOYEE WHERE DEL_FLG != '1' OR DEL_FLG IS NULL |
5) 「削除フラグ = 0 OR 削除フラグ IS NULL」という条件をつけて検索した場合も、同じデータが取得されることが確認できる。
1 2 | SELECT * FROM EMPLOYEE WHERE DEL_FLG = '0' OR DEL_FLG IS NULL |
要点まとめ
- 「削除フラグ」が0, 1, NULLの3通りの値を取り得る状態で、「削除フラグが1でないデータ」を取得する場合、「削除フラグ != 1」という条件を指定するとNULLのデータが取得されない。NULLのデータを取得するには、「OR 削除フラグ IS NULL」という条件を追加する必要がある。