IS [NOT] DISTINCT FROM (Transact-SQL)
適用于:SQL Server 2022 (16.x) Azure SQL 受控執行個體
比較兩個運算式的相等,並保證即使一個或兩個運算元都是 Null,也保證 true 或 false 結果。
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 | 與 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