IS [NOT] DISTINCT FROM (Transact-SQL)

適用于:SQL Server 2022 (16.x) Azure SQL 受控執行個體

比較兩個運算式的相等,並保證即使一個或兩個運算元都是 Null,也保證 true 或 false 結果。

IS [NOT] DISTINCT FROM 是 WHERE 子句和 HAVING 子句的搜尋條件、 FROM 子句的聯結條件,以及需要布林值的其他建構中使用的述詞。

Transact-SQL 語法慣例

語法

expression IS [NOT] DISTINCT FROM expression

引數

expression

任何有效的運算式

運算式可以是資料行、常數、函式、變數、純量子查詢,或由運算子或子查詢連接之資料行名稱、常數和函式的任何組合。

備註

將 Null 值與任何其他值進行比較,包括另一個 Null,將會產生未知的結果。 IS [NOT] DISTINCT FROM 一律會傳回 true 或 false,因為它會將 Null 值視為比較運算子時的已知值。

下列範例資料表使用值 A ,並 B 說明 IS [NOT] DISTINCT FROM 的行為:

A B A = B 與 B 不同
0 0 True True
0 1 False False
0 NULL Unknown False
NULL NULL Unknown True

執行包含 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

下列範例會傳回欄位與 17 整數值不同的資料列 id

USE tempdb;
GO
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;

結果會排除符合 17 值的所有資料列 id

id          message
----------- ---------
NULL        hello
10          NULL
NULL        NULL

B. 使用 IS NOT DISTINCT FROM

下列範例會傳回欄位與 17 整數值不相異的資料列 id

USE tempdb;
GO
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;

結果只會傳回符合 17 值的資料列 id

id          message
----------- --------
17          abc
17          yes

C. 針對 Null 值使用 IS DISTINCT FROM

下列範例會傳回欄位與 Null 不同的資料列 id

USE tempdb;
GO
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;

結果只會傳回不是 Null 的資料 id 列。

id          message
----------- --------
10          NULL
17          abc
17          yes

D. 針對 Null 值使用 IS NOT DISTINCT FROM

下列範例會傳回欄位與 Null 不相異的資料列 id

USE tempdb;
GO
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;

結果只會傳回 Null 的資料 id 列。

id          message
----------- --------
NULL        hello
NULL        NULL

另請參閱