IS [NOT] DISTINCT FROM (Transact-SQL)
適用対象: SQL Server 2022 (16.x) Azure SQL Database Azure SQL Managed Instance Microsoft Fabric の Azure SQL Managed Instance Microsoft Fabric のWarehouse SQL データベース
2 つの式の等価性を比較し、オペランドの一方または両方が NULL であっても、true または false の結果を保証します。
IS [NOT] DISTINCT FROM は、WHERE 句と HAVING 句の検索条件、FROM 句の結合条件、ブール値が必要なその他のコンストラクトで使用される述語です。
構文
expression IS [NOT] DISTINCT FROM expression
引数
式 (expression)
任意の有効な式。
式には、列、定数、関数、変数、スカラー サブクエリ、または 1 つ以上の演算子やサブクエリで接続された列名、定数、関数の組み合わせを使用できます。
注釈
NULL 値を他の値 (別の NULL を含む) と比較すると、不明な結果になります。 IS [NOT] DISTINCT FROM は常に true か false を返します。比較演算子として使用した場合、NULL 値は既知の値として扱われるためです。
次のサンプル テーブルでは、値 A
と B
を使用して、IS [NOT] DISTINCT FROM の動作を示しています。
A | B | A = B | A IS NOT DISTINCT FROM B |
---|---|---|---|
0 | 0 | True | True |
0 | 1 | False | False |
0 | NULL | Unknown | False |
NULL | NULL | Unknown | 正しい |
リンク サーバーに対して IS [NOT] DISTINCT FROM を含むクエリを実行する場合、リンク サーバーに送信されるクエリ テキストは、リンク サーバーに構文を解析する機能があることを確認できるかどうかによって異なります。
リンク サーバーが IS [NOT] DISTINCT FROM を解析できると判断した場合は、構文をそのままデコードします。 リンク サーバーが IS [NOT] DISTINCT FROM を解析できると判断できなかった場合は、次の式にデコードします。
A IS DISTINCT FROM B
は ((A <> B OR A IS NULL OR B IS NULL) AND NOT (A IS NULL AND B IS NULL))
にデコードされます
A IS NOT DISTINCT FROM B
は (NOT (A <> B OR A IS NULL OR B IS NULL) OR (A IS NULL AND B IS NULL))
にデコードされます
例
A. IS DISTINCT FROM を使う
次の例では、id
フィールドが整数値 17 とは異なる行が返されます。
DROP TABLE IF EXISTS #SampleTempTable;
GO
CREATE TABLE #SampleTempTable (id INT, message nvarchar(50));
INSERT INTO #SampleTempTable VALUES (null, 'hello') ;
INSERT INTO #SampleTempTable VALUES (10, null);
INSERT INTO #SampleTempTable VALUES (17, 'abc');
INSERT INTO #SampleTempTable VALUES (17, 'yes');
INSERT INTO #SampleTempTable VALUES (null, null);
GO
SELECT * FROM #SampleTempTable WHERE id IS DISTINCT FROM 17;
DROP TABLE IF EXISTS #SampleTempTable;
GO
その結果からは、id
が 17 という値と一致したすべての行が除外されます。
id message
----------- ---------
NULL hello
10 NULL
NULL NULL
B. IS NOT DISTINCT FROM を使う
次の例では、id
フィールドが整数値 17 に等しい行が返されます。
DROP TABLE IF EXISTS #SampleTempTable;
GO
CREATE TABLE #SampleTempTable (id INT, message nvarchar(50));
INSERT INTO #SampleTempTable VALUES (null, 'hello') ;
INSERT INTO #SampleTempTable VALUES (10, null);
INSERT INTO #SampleTempTable VALUES (17, 'abc');
INSERT INTO #SampleTempTable VALUES (17, 'yes');
INSERT INTO #SampleTempTable VALUES (null, null);
GO
SELECT * FROM #SampleTempTable WHERE id IS NOT DISTINCT FROM 17;
DROP TABLE IF EXISTS #SampleTempTable;
GO
その結果では、id
が 17 という値と一致した行のみが返されます。
id message
----------- --------
17 abc
17 yes
C. NULL 値に対して IS DISTINCT FROM を使う
次の例では、id
フィールドが NULL とは異なる行が返されます。
DROP TABLE IF EXISTS #SampleTempTable;
GO
CREATE TABLE #SampleTempTable (id INT, message nvarchar(50));
INSERT INTO #SampleTempTable VALUES (null, 'hello') ;
INSERT INTO #SampleTempTable VALUES (10, null);
INSERT INTO #SampleTempTable VALUES (17, 'abc');
INSERT INTO #SampleTempTable VALUES (17, 'yes');
INSERT INTO #SampleTempTable VALUES (null, null);
GO
SELECT * FROM #SampleTempTable WHERE id IS DISTINCT FROM NULL;
DROP TABLE IF EXISTS #SampleTempTable;
GO
その結果では、id
が NULL でなかった行のみが返されます。
id message
----------- --------
10 NULL
17 abc
17 yes
D. NULL 値に対して IS NOT DISTINCT FROM を使う
次の例では、id
フィールドが NULL に等しい行が返されます。
DROP TABLE IF EXISTS #SampleTempTable;
GO
CREATE TABLE #SampleTempTable (id INT, message nvarchar(50));
INSERT INTO #SampleTempTable VALUES (null, 'hello') ;
INSERT INTO #SampleTempTable VALUES (10, null);
INSERT INTO #SampleTempTable VALUES (17, 'abc');
INSERT INTO #SampleTempTable VALUES (17, 'yes');
INSERT INTO #SampleTempTable VALUES (null, null);
GO
SELECT * FROM #SampleTempTable WHERE id IS NOT DISTINCT FROM NULL;
DROP TABLE IF EXISTS #SampleTempTable;
GO
その結果では、id
が NULL だった行のみが返されます。
id message
----------- --------
NULL hello
NULL NULL