SQL Server возвращает строки, которые не равны <> значению и NULL - PullRequest
18 голосов
/ 15 декабря 2010

У меня есть таблица, в которой есть столбец значений, который может быть rowTypeID = (1,2,3 или ноль).Я хотел бы написать запрос, который возвращает любую строку, в которой нет значения 3.В этом примере я хочу, чтобы все строки NULL вместе со всеми 1,2 строками, я просто не хочу строки со значением 3

Установить ANSI null ON в настоящее время установлено для базы данных.

Мне любопытно, почему я не могу написать

select * from myTable where myCol <> 3

Этот запрос не вернет ни одной строки с NULL в столбце myCol

Мне нужноwrite

select * from my Table where myCol <> 3 or myCol Is NULL 

Всегда ли мне нужно включать IS NULL или я могу настроить его так, чтобы в предложении where myCol <> 3 возвращались строки, имеющие значение Null для моего Col

Ответы [ 5 ]

15 голосов
/ 15 декабря 2010

Я думаю, что ваш подход хорош:

SELECT *
FROM MyTable
WHERE myCol <> 3 OR myCol IS NULL

Поскольку вы запрашиваете альтернативы, другой способ сделать это состоит в том, чтобы сделать столбец NOT NULL и сохранить другое (неиспользованное) значение в базе данных.вместо NULL - например -1.Тогда выражение myCol <> 3 будет соответствовать вашему поддельному - NULL, как и любому другому значению.

SELECT *
FROM MyTable
WHERE myCol <> 3

Однако в целом я бы рекомендовал , а не , чтобы использовать этот подход.То, как вы уже делаете это, - правильный путь.

Также стоит упомянуть, что некоторые другие базы данных поддерживают IS DISTINCT FROM, что делает именно то, что вы хотите:

SELECT *
FROM MyTable
WHERE myCol IS DISTINCT FROM 3

MySQL имеет NULL-safe равно , которое также можно использовать для этой цели:

SELECT *
FROM MyTable
WHERE NOT myCol <=> 3

К сожалению, SQL Server пока не поддерживает ни один из этих синтаксисов.

3 голосов
/ 15 декабря 2010

Вы должны обрабатывать значения NULL так или иначе, поскольку выражения, включающие NULL , оцениваются как Unknown .Если хотите, вы можете вместо этого сделать:

select *
from MyTable
where isnull(MyColumn, -1) <> 3

Но это включает в себя магическое число (-1) и, возможно, менее читабельно, чем исходный тест для IS NULL.

Edit: и, как указывает SQLMenace, не является SARGable .

2 голосов
/ 15 декабря 2010

Всякий раз, когда вы проверяете значение, все значения NULL опускаются - в конце концов, вы проверяете, соответствует ли значение в некотором столбце определенным критериям, и NULL равно , а не значению .

1 голос
/ 15 декабря 2010

Всегда ли мне нужно включать IS NULL или я могу настроить его так, чтобы в предложении where myCol <> 3 возвращались строки со значением Null для моего Col?

Вы всегда , всегда , всегда должны включать is null.

Поскольку 3 не равно Не / Применимо и не равно Неизвестно.

0 голосов
/ 15 декабря 2010

, поскольку вы не можете сравнить NULL с чем-либо еще, NULL даже не равен NULL

DECLARE @i INT
DECLARE @i2 INT

SELECT @i = NULL, @i2 = NULL

IF @i = @i2
PRINT 'equal'
ELSE 
PRINT 'not equal'
...