IS [NOT] DISTINCT FROM (Transact-SQL)

適用対象: SQL Server 2022 (16.x)Azure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

2 つの式の等価性を比較し、オペランドの一方または両方が NULL であっても、true または false の結果を保証します。

IS [NOT] DISTINCT FROM は、WHERE 句と HAVING 句の検索条件、FROM 句の結合条件、ブール値が必要なその他のコンストラクトで使用される述語です。

Transact-SQL 構文表記規則

構文

expression IS [NOT] DISTINCT FROM expression

引数

式 (expression)

任意の有効な

式には、列、定数、関数、変数、スカラー サブクエリ、または 1 つ以上の演算子やサブクエリで接続された列名、定数、関数の組み合わせを使用できます。

注釈

NULL 値を他の値 (別の NULL を含む) と比較すると、不明な結果になります。 IS [NOT] DISTINCT FROM は常に true か false を返します。比較演算子として使用した場合、NULL 値は既知の値として扱われるためです。

次のサンプル テーブルでは、値 AB を使用して、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

関連項目