Поделиться через


IS [NOT] DISTINCT FROM (Transact-SQL)

Область применения: SQL Server 2022 (16.x) База данных SQL Azure Управляемый экземпляр SQL Azure конечную точку аналитики SQL в хранилище Microsoft Fabric в базе данных Microsoft Fabric SQL в 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

В. Использование 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

См. также