Предложение T-SQL WHERE - сравнение столбца с самим собой не удается для нулевых столбцов

Я обычно использую такую ​​конструкцию для применения фильтров к столбцам:

CREATE TABLE test(a int NOT NULL, b int NULL)
--insert some data
INSERT INTO test(a,b) values (1,1)
INSERT INTO test(a,b) values (1,NULL)

declare @a int
declare @b int
set @a = 1
--@b is null at this time

select * from test
  where a = @a
    and b = isnull(@b,b)

Это выбирает только первую строку.

Например, если бы это была хранимая процедура, а аргумент @b был нулевым, я мог бы указать его значение, чтобы «включить» его в предложении where, и указать значение NULL, чтобы выбрать, где b=b, что было бы истинным для каждого столбца, < strong>НО если в столбце b есть значение NULL, оно не будет выбрано. Есть ли стандартный способ справиться с этим? Итак, что я должен использовать в приведенном выше примере запроса, чтобы выбрать все строки, даже если столбец b имеет нулевые значения?


person Axarydax    schedule 12.11.2010    source источник


Ответы (1)


Для проверки значений NULL вам нужно сделать это как b is null

Вы можете изменить запрос как -

select * from test
  where a = @a
    and b = isnull(@b,b)
    or (@b is null and b is null)
person Sachin Shanbhag    schedule 12.11.2010
comment
спасибо, но это работает, если @b равно NULL, но если @a = 1, @b = 1, запрос должен возвращать только первую строку (с вашим исправлением он возвращает обе строки) - person Axarydax; 12.11.2010
comment
ОК, изменение его на выбор * из теста, где a = @a и (b = isnull(@b,b) или (b равно null и @b равно null)) помогло! еще раз спасибо - person Axarydax; 12.11.2010
comment
@Axarydax - Аааа.. Как раз вовремя. Вы получили ответ до моего редактирования. - person Sachin Shanbhag; 12.11.2010