NULL
SQL文を書くとき、データがnullを取りうるか否かを常に意識する必要があります。
nullを検索するためには、明示的に is null や is not null を使用する必要があります。
また、SQL Server で NULL 値を別の値にチェック後に変換するには、ISNULL 関数を使用します。
NULLについては「データベースのNULL」にも少し説明してあります。
NULL を扱う
null 値を許可している場合、かつ、その値が検索対象になっている場合は先の is null や is not null を使用します。
簡単な例を下に示しておきます。
declare @tbl1 table(a_cd char(9), b_kbn char(1), c_kbn int)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000001','1',0)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000010','1',1)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000020','2',1)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000030','2',1)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000040','3',null)
select * from @tbl1
select * from @tbl1 where c_kbn = 0 or c_kbn <> 0
select * from @tbl1 where c_kbn is null
select * from @tbl1 where c_kbn is not null
select a_cd, b_kbn, isnull(c_kbn, -1) from @tbl1
select a_cd, b_kbn,
case
when c_kbn is not null then c_kbn
when c_kbn is null then '-1'
end
from @tbl1
更にANSI/ISOのCOALESCE関数を使うこともできます。
declare @tbl1 table(a_cd char(9), b_kbn char(1), c_kbn int)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000001','1',0)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000010','1',1)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000020','2',1)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000030','2',1)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000040','3',null)
select a_cd, b_kbn, coalesce(c_kbn, '-1') from @tbl1
この他、SQL Server では、ANSI_NULLS の設定で = , <> を使用できるようになる。
declare @tbl1 table(a_cd char(9), b_kbn char(1), c_kbn int)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000001','1',0)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000010','1',1)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000020','2',1)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000030','2',1)
insert into @tbl1 (a_cd,b_kbn,c_kbn) values ('000000040','3',null)
set ansi_nulls on
select * from @tbl1 where c_kbn = null
select * from @tbl1 where c_kbn &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; null
set ansi_nulls off
select * from @tbl1 where c_kbn = null
select * from @tbl1 where c_kbn &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; null
ISNULLでNullを置換する
ISNULLでNULLを他の文字に置き換える方法もありますので紹介しておきます。
構文:ISNULL(チェック対象, 変換したい文字列)
ISNULLの第1パラメータの値がNULLであれば、第2パラメータの文字列を返します(変換します)。
NULLでなければ、第1パラメータの値をそのまま返します。
declare @val integer
set @val = null
select isnull(@val, 1)
set @val = 0
select isnull(@val, 1)
以上、null の扱いかたでした。