Подтвердить что ты не робот

SQL Server возвращает строки, которые не равны <> значению и NULL

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

В настоящий момент для базы данных установлено значение ANSI null ON.

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

select * from myTable where myCol <> 3

Этот запрос не будет возвращать строки, имеющие NULL в столбце myCol

Мне нужно написать

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

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

4b9b3361

Ответ 1

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

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

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

SELECT *
FROM MyTable
WHERE myCol <> 3

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

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

SELECT *
FROM MyTable
WHERE myCol IS DISTINCT FROM 3

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

SELECT *
FROM MyTable
WHERE NOT myCol <=> 3

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

Ответ 2

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

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

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

Изменить: и, как указывает SQLMenace, не SARGable.

Ответ 3

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

Ответ 4

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

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

Потому что 3 не соответствует Not/Applicable и не соответствует Unkown.

Ответ 5

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

DECLARE @i INT
DECLARE @i2 INT

SELECT @i = NULL, @i2 = NULL

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