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で処理しないで、期待される出力には注意してください