明るく

暗く

SQL

【SQL】特定の文字以外という条件でNULLのレコードも取得したい

2024.1.16

2024.4.20

【SQL】特定の文字以外という条件でNULLのレコードも取得したい

この記事をご覧いただいている方の中には 

NULLが表示されないの 

まずNOTイコールとは何か、概念も使い方も分かっていない 

という方がいるのではないでしょうか。 

 

そこでこの記事では特定の文字以外を検索しているのに、NULLレコード検索できない問題を解決していきます 

具体的には

そもそもNOTイコールとは何か?
特定の文字以外の条件でNULLレコードが取得できない場合の解決法 

の順番に重要なポイントだけを紹介します。

環境

今回はOracle Databaseサーバーで、PL/SQLにて説明ます。

今回の課題

SQLで特定の文字以外の条件でデータを取得する際に起こる、以下の現象を取り上げます。

column
A
B
NULL
C

上記のようなテーブル(テーブル名:table_1)った際「column」という名前のカラムからB以外の特定の文字を取得するとしましょう。

まずNOTイコール(<>,!=)を使ってB以外という条件を指定します。

SELECT column FROM table_1 WHERE column <> 'B' ;

または、

SELECT column FROM table_1 WHERE column != 'B' ;
この場合下記のようにA,Cが表示されnullが取得されません
column
A
C

ではA、Cだけでなくnullも取得したい場合は、どうしたらいいでしょうか。

注意!NOT イコールでは対処できない

まずエラーを解決する前に注意事項があります。

PL/SQLではNOTイコールの演算子に<>、!=だけでなく、^=  、 ~=というPL/SQLだけで使える演算子もあるのです。

【スクリプトで使うのは非推奨】PL/SQLにだけあるNOT イコールの演算子(^=、~=)

^=  、 ~=はSQL Serverなど他サーバーで使えませんが、別の案件でバグが発生したり、

Oracle DatabaseサーバーからSQL Serverなど他のサーバーに移行したりする場合があります。

そのため、この演算子の使用をオススメできません。

【演算子の存在だけを記憶しよう】PL/SQLにだけあるNOT イコールの演算子(^=、~=)

PL/SQLには^=,~=という演算子が存在しているため、今回の場合では^=,~=という演算子を使うのはオススメできませんが、使われていることがないとは限りません。

そのため、^=,~=という独特の演算子があるということを覚えておきましょう

そもそもNOT イコール(<>、!=)とは?

そもそもNOTイコールとは「等しくない」、「以外」という意味です。

例えば以下の図のようにA,B,Cという文字があった時にX NOT イコール BならX はAかまたはCです

以下の図ではグレーの部分が該当します

これは文字(String型)だけでなく、数字の場合でも同様です

例えば以下の図のように1,2,3という文字があった時にX NOT イコール 1ならX は2かまたは3です

以下の図ではグレーの部分が該当します

NOT INでも対処は不可能

複数条件に一致するかどうかをまとめて判別する、in句がありますが、

その逆で複数の条件に該当しない要素を調べるNOT IN句というものもあります。

例えば以下の図のように、A,B,Cという文字があった時にX NOTイコール (A,B)ならXはCす。

検索するスクリプトは以下のように書きます。

SELECT column FROM table_1 WHERE column NOT IN ('A','B');

以下の図ではグレーの部分が該当します

課題への対処法

ノットイコール(<>,!=)またNOT IN句ではnullは判できません

nullは文字や数字、空文字、半角スペース、全角スペースと違って何も無い存在で、他の値と扱いが異なります

nullは、文字や数字などとは違う概念なのですそのためNOTイコールやNOT IN句では、nullを判別できないのです。

解説:null

「何も無い」というデータ形。

数字等の値や文字列だけでなく、空である(データがない)こととも異なる。

これは「空である」というデータが存在するのに対し、nullはそもそものデータが「何も存在しない」ことを指す。

今回の課題は、A、B、C、nullのうち、B以外のすべてのデータを取得することです。

そのため、NOT イコールでnullのレコードも必要な場合は条件に IS NULL も付ける必要があります

SELECT column FROM table_1 WHERE column <> 'B' OR column IS NULL;

これでNULLを含め、B以外のデータを取得できました。

column
A
C
NULL

また、例えばA、B以外のデータを取得したい場合は、複数の条件に該当しないか判別するNOT IN句使います。

しかしNOT IN句はNOT イコールと同様にNULLを取得できないためIS NULL を付ける必要があります

SELECT column FROM table_1 WHERE column NOT IN ('A','B') OR column IS NULL;

これでNULLを含め、A,B以外のデータを取得できました。

column
C
NULL

コラム:IS NOT NULL演算子

null以外を探したい場合は、「IS NOT NULL演算子」を使います。

SELECT column FROM table_1 WHERE column IS NOT NULL;

これでnull以外のデータを取得できました。

column
A
B
C

まとめ SQLで特定の文字以外の条件でNULLのレコードが取得されない時の対応

NOTイコール(<>,!=)ではNULLレコードは取得できません。

NULLも取得したい場合IS NULLも使いましょう。

コラム:SQL Server

企業でよく使われているサーバーに、SQL Serverがあります。

こちらもNOTイコールの演算子は(<>、!=)です。

SQL Serverも同様にNOTイコールではNULLを判別できません。

IS NULLが必要です。

select column from table_1 WHERE column <> 'B' OR column IS NULL;

上記のスクリプトで特定の文字以外の文字とNULLが取得できます。

column
A
C
NULL