Как заставить SQL распознавать столбец WHERE = NULL? - PullRequest
8 голосов
/ 30 июня 2011

В Microsoft SQL у меня есть следующее утверждение (примерно):

UPDATE sometable 
   SET somecolumn = @somevalue 
 WHERE somecolumn = NULL;

@somevalue предварительно установлено в сценарии.

Это работает нормально, и SQL сообщает мне ноль строкнаходятся под влиянием.Есть пять строк, где somecolumn NULL.Что я делаю не так?

Ответы [ 4 ]

17 голосов
/ 30 июня 2011

Вместо этого вы должны использовать IS NULL для проверки значения NULL в столбце.

4 голосов
/ 30 июня 2011

Попробуйте ЕСТЬ НУЛЬ

UPDATE sometable 
   SET somecolumn = @somevalue 
 WHERE somecolumn IS NULL;

Источник: http://blogs.msdn.com/b/sqlclr/archive/2005/06/21/431329.aspx

3 голосов
/ 30 июня 2011

Джо прав.Ничто не может быть равным нулю.Он может быть только нулевым, поэтому ОБНОВЛЕНИЕ mytable SET mycolumn = @value ГДЕ anotherColumn IS NULL.

1 голос
/ 24 марта 2012

ANSI SQL определяет NULL как ничто не равное - даже другой экземпляр NULL. Канонический способ - использовать IS NULL и IS NOT NULL.

Существует также опция MS SQL Server SET ANSI_NULLS. Отключение этой опции приводит к тому, что WHERE x = NULL делает именно то, что вы ожидаете. Однако он также будет включать в запрос любые значения NULL, например WHERE x <> 'abc', что может не соответствовать ожидаемому. Этот параметр зависит от конкретного подключения, поэтому изменение его для вашего подключения не повлияет на других. Вы также можете установить настройки по умолчанию на уровне базы данных. При создании хранимой процедуры параметр захватывается в время создания , а не время выполнения.

Еще одна хитрость заключается в создании запроса, подобного WHERE ISNULL(x, '') = ISNULL(@x, ''). Я не думаю, что это SARGable, поэтому производительность не так хороша, как WHERE (x IS NULL AND @x IS NULL) OR (x = @x), но гораздо приятнее писать и динамически создавать.

Да, и, поскольку мы говорим об ANSI SQL. Версия ANSI SQL для ISNULL: COALESCE.

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