この記事をご覧いただいている方の中には、
・なぜ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 |
最新記事
-
【初めてでも安心】プロジェクト計画の基本と成功へのステップガイド
2024.9.5
-
【初心者必見】システム設計の基本から学ぶ!成功するプロジェクトの秘訣
2024.9.5
-
【Googleフォームをカスタマイズ】完了画面(サンクスページ)の編集方法
2024.6.26
-
addEventListenerを使用する時の注意点とエラーの解決方法
2024.5.9