新人SEのためのSQL NULL ( Oracleの「''」はnullになる )

SQLでややこしくて、よく理解しないまま過ごしてしまいがちなのがNULLではないでしょうか? しかも、DBMSによっても微妙に違いますので、尚更注意が必要です。

ここでは、Oracleを使って説明します。

Oracleは長さゼロの文字はNULLになる

まず初めに、Oracleは長さゼロの文字はNULLになるので注意が必要です。

「'' (シングルコーテーション2つ)」を挿入すると、結果はNULLです。
他のDBMSは、「''」と「NULL」は別物であることが多いと思いますので気を付けてください。

これは知っていないとトラブルにつながりますよね。

まず、以下のテーブルを用意します。

create table null_test
(
id char(3),
c char(3),
n number(3)
) ;

insert into null_test values('001','','');
insert into null_test values('002',null,null);
commit;

この表に以下の問い合わせをしてみます。
select * from null_test order by 1;

(結果)
ID C N
------ ------- -------
001
002

こんな感じで中身がサッパリ分かりませんので、NVLで変換してみます。

select id,nvl(c,'nullです'),nvl(n,999) from null_test order by 1;

ID NVL(C,'NULLです') NVL(N,999)
------ ---------------------- -------------
001 nullです 999
002 nullです 999

「''」も「null」もnullになっています。

Oracleしか使ったことがない、あるいは、Oracleを使ったことがない仲間がメンバーに加わったら、ぜひ教えてあげてください。

ここから先は、普通にnullの話です。

NULLは普通に「=」「<>」では引っかからない。

以下の問い合わせを投げてみると、

select * from null_test where c = '' or c <> '';
select * from null_test where n = '' or n <> '';
select * from null_test where n > 0 or n < 0;

結果はどれも、

レコードが選択されませんでした。

になります。

NULL同士の項目も比較できない

NULLの項目とNULLの項目を「=」で比較してもイコールにはなりません。

>select * from null_test n1,null_test n2 where n1.c = n2.c ;
レコードが選択されませんでした。

NULLは足しても引いてもNULL掛けても割ってもNULL

次に、NULLは足しても引いても割っても掛けてもNULLです。

select id , n+1 , n*1 , n/1 from null_test;

上のSQLの実行結果は、以下となります。

ID N+1 N*1 N/1
---------- --------- ----------- ---------
001

一応、念のためNVLで変換しておきます。

select id,nvl(n+1,999),nvl(n*1,999),nvl(n/1,999) from null_test;

ID NVL(N+1,999) NVL(N*1,999) NVL(N/1,999)
------ ---------------- ---------------- -------------------
001 999 999 999

やっぱり、全部NULLになりました。

IS NULL ・ IS NOT NULL

NULLの判定は、IS NULL IS NOT NULLを使います。

select * from null_test where c is null order by 1;

(結果)
ID C N
------ ------- -------
001
002

抽出されました。

select * from null_test where c is not null order by 1;

(結果)
レコードが選択されませんでした。

NVL

NULLの時に別の値に変換する関数です。よく使います。

上の例で既に使っていますが、

select id, nvl( c ,'NULLです' ), nvl( n , 999 ) from null_test order by 1;

(結果)
ID NVL(C,'NULLです') NVL(N,999)
------ ---------------------- -------------
001 nullです 999
002 nullです 999

外部結合の時にはどうしてもNULLが生じますから、よく使います。

という事で、皆様、NULLには十分気を付けてください。

コメントを残す

メールアドレスが公開されることはありません。

13 − eight =