我通常使用这样的结构将过滤器应用于列:
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
为null,我可以在where
子句中指定其值'enable',并指定NULL
值为选择b = b的位置,对于每列都是如此, BUT 如果NULL
列中有b
值,则不会被选中。有没有一种标准的方法可以解决这个问题?那么即使b
列具有空值,我应该在上面的示例查询中使用什么来选择所有行?
答案 0 :(得分:2)
要检查NULL值,您需要将其作为b is null
您可以将查询更改为 -
select * from test
where a = @a
and b = isnull(@b,b)
or (@b is null and b is null)