Проблема сравнения smallint в предложении where - PullRequest
2 голосов
/ 29 апреля 2011

У меня есть таблица со столбцом с именем status типа smallint, которая принимает значение null. SQL Server 2000.

Мои данные содержат в основном 2 в этом поле, но также 0 и ноль.

Когда я делаю

select *
from table
 where status <> 2

Я не получаю все нужные записи (где статус равен нулю или 0). Есть идеи, почему это происходит и как исправить? Разве <> не должен давать мне все, кроме 2?

Ответы [ 3 ]

2 голосов
/ 29 апреля 2011

Тест NULL не соответствует никакому арифметическому сравнению.

использование

where status <> 2 OR status is null
1 голос
/ 29 апреля 2011

То, что вы ожидаете, может быть достигнуто, если отключить ANSI_NULLS.

Например, попробуйте выполнить следующие запросы:

set ansi_nulls off
select case when 1 != null then 'true' else 'false' end

set ansi_nulls on
select case when 1 != null then 'true' else 'false' end

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

Ваше предложение WHERE должно выглядеть следующим образом:

where status <> 2 or status is null

Другой вариант - просто сравнить с status = 1, если это единственный статус, который вы ожидаете включить в свой запрос.

1 голос
/ 29 апреля 2011
select *
from table
 where ISNULL(status, 1) <> 2

NULL не сравнивается : удалите его.

Ваш пример - "распространенная ошибка" в Википедии тоже ...

...