IS [NOT] DISTINCT FROM (Transact-SQL)
適用於: sql Server 2022 (16.x) Azure SQL 資料庫 Azure SQL 受控執行個體 Microsoft Fabric 倉儲中 Microsoft Fabric SQL Database Microsoft Fabric SQL 資料庫中的 SQL 分析端點
比較兩個運算式是否相等並保證結果為 true 或 false,即使一或兩個運算元為 NULL 也一樣。
IS [NOT] DISTINCT FROM 是一個述詞,可在 WHERE 子句和 HAVING 子句的搜尋條件中、FROM 子句的聯結條件中,以及其他需要布林值的建構中使用。
語法
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 | 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