DB

Oracle上でNULLを含む項目値を検索条件に指定してみた

例えば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_1

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

実行結果_1_2

2) 一部データの削除フラグの値を、0または1に更新する。

実行結果_2_1

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

実行結果_2_2

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

実行結果_3

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

実行結果_4

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

実行結果_5

要点まとめ

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