Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Относится к: SQL Server 2022 (16.x)
Azure SQL Database
AzureSQL Managed Instance
SQL analytics endpoint in Microsoft Fabric
Warehouse in Microsoft Fabric
SQL database in Microsoft Fabric
Сравнивает равенство двух выражений и гарантирует истинный или ложный результат, даже если один или оба операнда имеют значение NULL.
IS [NOT] DISTINCT FROM — это предикат, который используется в условиях поиска предложений WHERE и HAVING, в условиях соединения предложений FROM и других конструкциях, где требуется логическое значение.
Соглашения о синтаксисе Transact-SQL
Syntax
expression IS [NOT] DISTINCT FROM expression
Arguments
expression
Любое допустимое выражение.
Выражение может являться столбцом, константой, функцией, переменной, скалярным вложенным запросом или любым сочетанием имен столбцов, констант и функций, связанных операторами или вложенным запросом.
Remarks
Сравнение значения NULL с любым другим значением, включая другое значение NULL, будет иметь неизвестный результат. IS [NOT] DISTINCT FROM всегда возвращает значение true или false, так как оно будет обрабатывать значения NULL как известные значения при использовании в качестве оператора сравнения.
В следующей таблице используются значения A и B, чтобы продемонстрировать поведение IS [NOT] DISTINCT FROM:
| A | B | A = B | A НЕ ОТЛИЧАЕТСЯ ОТ 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))
Examples
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. Использование 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