IS [NOT] DISTINCT FROM (Transact-SQL)
Область применения: SQL Server 2022 (16.x) База данных SQL Azure Управляемый экземпляр SQL Azure конечную точку аналитики SQL в хранилище Microsoft Fabric в Microsoft Fabric
Сравнивает равенство двух выражений и гарантирует истинный или ложный результат, даже если один или оба операнда имеют значение NULL.
IS [NOT] DISTINCT FROM — это предикат, который используется в условиях поиска предложений WHERE и HAVING, в условиях соединения предложений FROM и других конструкциях, где требуется логическое значение.
Соглашения о синтаксисе Transact-SQL
Синтаксис
expression IS [NOT] DISTINCT FROM 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 | Истина | Истина |
0 | 1 | False | Ложь |
0 | NULL | Неизвестно | False |
NULL | NULL | Неизвестно | Истина |
При выполнении запроса, содержащего 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))
Примеры
А. Использование 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. Использование IS DISTINCT FROM для значения NULL
В следующем примере возвращаются строки, в которых поле 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. Использование IS NOT DISTINCT FROM для значения NULL
В указанном ниже примере возвращаются строки, в которых поле 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