IS [NOT] DISTINCT FROM (Transact-SQL)

適用于: Microsoft Fabric 中 Microsoft Fabric 倉儲中的 SQL Server 2022 (16.x) Azure SQL 資料庫 Azure SQL 受控執行個體 SQL 分析端點

比較兩個運算式是否相等並保證結果為 true 或 false,即使一或兩個運算元為 NULL 也一樣。

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 值作為比較運算子時,會被視為已知值。

下列範例資料表使用值 AB 來說明 IS [NOT] DISTINCT FROM 的行為:

A B A = B A IS NOT DISTINCT FROM B
0 0 True True
0 1 False
0 NULL Unknown
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

另請參閱