Есть ли в SQL Server параметр, в котором значение null = null должно быть равно true? - PullRequest
3 голосов
/ 23 декабря 2008

Есть ли в SQL Server параметр, в котором значение null = null должно быть равно true?

Ответы [ 5 ]

9 голосов
/ 23 декабря 2008

Это не ошибка SQL Server, это связано с троичной логикой, представленной значением NULL. NULL = NULL никогда не будет истиной, и NULL <> NULL также не является истиной.

вы можете использовать ANSI_NULL OFF, но:

"В будущей версии SQL Server ANSI_NULLS всегда будет включен, и любые приложения, которые явно установят для параметра значение OFF, будут генерировать ошибку. Избегайте использования этой функции в новых разработках и планируйте модифицировать приложения, которые в настоящее время используют это особенность. "

Разве COALESCE не сделает то, что вам нужно?

3 голосов
/ 23 декабря 2008

Из документации MSDN :

SET ANSI_NULLS OFF

Создает следующие результаты сравнения:

  10  = NULL   False
NULL  = NULL   True
  10 <> NULL   True
NULL <> NULL   False

Со следующей настройкой, которая используется по умолчанию:

SET ANSI_NULLS ON

То же сравнение даст следующие результаты:

  10  = NULL   NULL (Unknown)
NULL  = NULL   NULL (Unknown)
  10 <> NULL   NULL (Unknown)
NULL <> NULL   NULL (Unknown)

Редактировать : Хорошо, поэтому в комментариях я попробовал какой-то конкретный SQL, чтобы проверить утверждения, что это не работает, и вот что я нашел:

SET ANSI_NULLS OFF
CREATE TABLE TestTable (USERNAME VARCHAR(20))
INSERT INTO TestTable VALUES (NULL)
SELECT * FROM TestTable WHERE USERNAME = USERNAME
SELECT * FROM TestTable WHERE USERNAME = NULL

Производит этот вывод:

[USERNAME]
(0 row(s) affected)

[USERNAME]
NULL
(1 row(s) affected)

Так что я думаю, что этот параметр некорректен. Я видел и использовал этот параметр только в одном конкретном запросе на создание отчетов, поэтому не знал о разнице в планах запросов, которая заставляет его работать в одном случае, а не в другом.

Тогда нет никакой настройки, которая работает.

Даже если это сработало, как и в других ответах здесь, полагаться на этот параметр - плохая идея, так как он будет извлечен из SQL Server в будущей версии.

Ну хорошо.

1 голос
/ 23 декабря 2008

Да, в общем, это нехорошо.

Я только что упомянул это в случае, если вы проводите сравнение, когда ваш первый объект может не быть нулевым в сравнении:

val IS NULL может использоваться для проверки, является ли что-то нулевым или нет.

NULL = NULL должно быть False, потому что Unknown = Unknown is Unknown или False.

0 голосов
/ 23 декабря 2008

Возможно, мы имеем дело с этим на неправильном уровне абстракции. Похоже, у вас есть запрос, в котором вы указали его таким образом, что вы не получили ожидаемого результата. Итак, вы задали вопрос о том, как изменить базу данных, чтобы она дала вам то, что вы ожидаете, а не то, что база данных поняла.

Не лучше ли спросить о том, как пересмотреть ваш запрос, чтобы база данных понимала его так, как вы хотели?

Затем вы заканчиваете утверждением, что это усложнит другие запросы. Я думаю, что у многих из нас, кто это читал, была общая реакция «ой». потому что, учитывая ваше очевидное понимание NULL, это, вероятно, верно.

Мы могли бы помочь нам обсудить ваше понимание значений NULL, если вы сообщите нам, что, по вашему мнению, вызовет эти проблемы.

0 голосов
/ 23 декабря 2008

Я буду избегать установки ansi_nulls и использовать функцию isnull, хотя это может усложнить некоторые запросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...