Microsoft SQL Server
NULL
サーチ…
前書き
SQL Serverでは、 NULL
は見つからないか不明なデータを表します。つまり、 NULL
は実際に値ではありません。それは値のプレースホルダとして記述する方が良いでしょう。これはまた、 NULL
を他の値と比較することができない理由でもありNULL
。
備考
SQL Serverには、 IS NULL
、 IS NOT NULL
、 ISNULL()
、 COALESCE()
などのNULLを処理するための他のメソッドが用意されていIS NULL
。
NULL比較
NULL
は比較に当てはまる特別なケースです。
以下のデータを仮定します。
id someVal
----
0 NULL
1 1
2 2
クエリの場合:
SELECT id
FROM table
WHERE someVal = 1
id 1
を返します
SELECT id
FROM table
WHERE someVal <> 1
id 2
を返します
SELECT id
FROM table
WHERE someVal IS NULL
id 0
を返す
SELECT id
FROM table
WHERE someVal IS NOT NULL
両方のID返します1
と2
。
NULLを=
、 <>
比較の値として「カウント」したい場合は、最初にカウント可能なデータ型に変換する必要があります。
SELECT id
FROM table
WHERE ISNULL(someVal, -1) <> 1
または
SELECT id
FROM table
WHERE someVal IS NULL OR someVal <> 1
0
と2
返します
またはANSI Null設定を変更することもできます。
ANSI NULLS
MSDNから
SQL Serverの将来のバージョンでは、ANSI_NULLSは常にONになり、明示的にオプションをOFFに設定したアプリケーションはエラーを生成します。新しい開発作業でこの機能を使用しないでください。現在、この機能を使用しているアプリケーションを変更する予定です。
ANSI NULLS
をオフに設定すると、NULL値の=
/ <>
比較が可能になります。
以下のデータが与えられます:
id someVal
----
0 NULL
1 1
2 2
ANSI NULLSをonに設定すると、次のクエリが実行されます。
SELECT id
FROM table
WHERE someVal = NULL
結果が得られません。ただし、ANSI NULLSをオフにした同じクエリ:
set ansi_nulls off
SELECT id
FROM table
WHERE someVal = NULL
id 0
返し0
。
無効です()
IsNull()
関数は2つのパラメータを受け取り、最初のパラメータがnull
場合は2番目のパラメータを返しnull
。
パラメーター:
- チェック式。任意のデータ型の任意の式。
- 交換価値。これは、チェック式がnullの場合に返される値です。置換値は、検査式のデータ・タイプに暗黙的に変換できるデータ・タイプでなければなりません。
IsNull()
関数は、チェック式と同じデータ型を返します。
DECLARE @MyInt int -- All variables are null until they are set with values.
SELECT ISNULL(@MyInt, 3) -- Returns 3.
上記のCOALESCE
も参照してください。
null /はnullではありません
nullは値ではないため、nullを持つ比較演算子を使用することはできません。
列または変数がnullを保持するかどうかをチェックするにis null
を使用する必要がis null
。
DECLARE @Date date = '2016-08-03'
次の文は、NULL値とのすべての比較がfalseまたはunknownと評価されるため、値6
を選択します。
SELECT CASE WHEN @Date = NULL THEN 1
WHEN @Date <> NULL THEN 2
WHEN @Date > NULL THEN 3
WHEN @Date < NULL THEN 4
WHEN @Date IS NULL THEN 5
WHEN @Date IS NOT NULL THEN 6
@Date変数の内容をnull
設定してやり直すと、次の文は5
を返します。
SET @Date = NULL -- Note that the '=' here is an assignment operator!
SELECT CASE WHEN @Date = NULL THEN 1
WHEN @Date <> NULL THEN 2
WHEN @Date > NULL THEN 3
WHEN @Date < NULL THEN 4
WHEN @Date IS NULL THEN 5
WHEN @Date IS NOT NULL THEN 6
COALESCE()
COALESCE ()
順序で引数を評価し、最初に評価されなかった最初の式の現在の値をNULL
戻しNULL
。
DECLARE @MyInt int -- variable is null until it is set with value.
DECLARE @MyInt2 int -- variable is null until it is set with value.
DECLARE @MyInt3 int -- variable is null until it is set with value.
SET @MyInt3 = 3
SELECT COALESCE (@MyInt, @MyInt2 ,@MyInt3 ,5) -- Returns 3 : value of @MyInt3.
ISNULL()はCOALESCE()と同様に動作しますが、ISNULL()関数は2つのパラメーター(1つは検査するパラメーター、1つ目のパラメーターがNULLの場合に使用するパラメーター)を受け入れます。下記のISNULL
も参照してください。
サブクエリにNOTを含むNULL
サブクエリでnullを持つサブクエリでは処理しませんが、期待した結果を得るにはNULLSを除去する必要があります
create table #outertable (i int)
create table #innertable (i int)
insert into #outertable (i) values (1), (2),(3),(4), (5)
insert into #innertable (i) values (2), (3), (null)
select * from #outertable where i in (select i from #innertable)
--2
--3
--So far so good
select * from #outertable where i not in (select i from #innertable)
--Expectation here is to get 1,4,5 but it is not. It will get empty results because of the NULL it executes as {select * from #outertable where i not in (null)}
--To fix this
select * from #outertable where i not in (select i from #innertable where i is not null)
--you will get expected results
--1
--4
--5
サブクエリではnullで処理しないで、期待される出力には注意してください