DISTINCT NULL возвращает один NULL в SQL Server - PullRequest
17 голосов
/ 17 мая 2019

В Sql Server NULL НЕ РАВНО НУЛЬ. ( Почему NULL = NULL оценивается как false в SQL-сервере ) Тогда почему следующий код возвращает один NULL.

CREATE TABLE #TEMP1
    (ID INT)
INSERT INTO #TEMP1
SELECT NULL
UNION ALL
SELECT NULL
SELECT DISTINCT ID FROM #TEMP1
DROP TABLE #TEMP1

ID
------
NULL

Я ожидал

ID
------
NULL
NULL

Ответы [ 2 ]

35 голосов
/ 17 мая 2019

Обработка значений NULL для DISTINCT сравнения явно вызвалась в документации .Выдержка:

DISTINCT

Указывает, что в наборе результатов могут отображаться только уникальные строки.Нулевые значения считаются равными для целей ключевого слова DISTINCT.

1 голос
/ 17 мая 2019

Мало того, что это упоминается в документации, это другой вид теста на равенство.Неизвестно ли равное неизвестному?Кто знает, может, да, может, нет.Но именно поэтому Distinct должен возвращать только 1. Если бы он возвращал 2 разных значения, это означало бы, что неизвестные были разными.Существует по крайней мере одно неизвестное значение, поэтому оно должно быть в списке, отличается ли оно от любого другого неизвестного значения, ну, в общем, неизвестно.

Нулевые значения также сравниваются как равные для Intersect.

Select 1
Where exists (select null intersect select null)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...