サーチ…


前書き

SQL Serverでは、 NULLは見つからないか不明なデータを表します。つまり、 NULLは実際に値ではありません。それは値のプレースホルダとして記述する方が良いでしょう。これはまた、 NULLを他の値と比較することができない理由でもありNULL

備考

SQL Serverには、 IS NULLIS NOT NULLISNULL()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返します12

NULLを=<>比較の値として「カウント」したい場合は、最初にカウント可能なデータ型に変換する必要があります。

 SELECT id
 FROM table
 WHERE ISNULL(someVal, -1) <> 1

または

 SELECT id
 FROM table
 WHERE someVal IS NULL OR someVal <> 1

02返します

または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

パラメーター:

  1. チェック式。任意のデータ型の任意の式。
  2. 交換価値。これは、チェック式が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で処理しないで、期待される出力には注意してください



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow