如何检查列是否等于可以为null的变量

时间:2012-03-16 16:56:08

标签: sql sql-server

我有一个包含varchar列的表,该列允许空值或空值。

我正在编写一个存储过程,其中包含一个可以分配给空值或常规字符串(非空)的变量

它的定义如下:

declare @myvar varchar(50)

现在我正在尝试编写一个返回列等于此变量的行的查询,或者它是空的或null。到目前为止,我认为这将起作用:

select * from mytable where mycolumn =@myvar or mycolumn =''

但是,如果列为null且变量为null,则不会返回任何值。

我知道我可以做这样的事情:

select * from mytable where (mycolumn = @myvar and mycolum is not null) or mycolumn is null or mycolumn =''

有更好的方法吗?

PS:我不想做ANSI_NULLS OFF

由于

3 个答案:

答案 0 :(得分:11)

如果希望列与参数完全匹配(包括空值)

DECLARE @myVariable varchar(10)

SELECT * 
FROM mytable 
WHERE ((@myVariable IS NULL AND myColumn IS NULL) OR myColumn = @myVariable)

答案 1 :(得分:3)

您不需要此部分:and mycolum is not null因为,如您所说,如果您的变量为NULL,它仍然不匹配。所以我认为这实际上是最好的方式:

select * 
from mytable
where mycolumn = @myvar or mycolumn is null or mycolumn =''

如果你想做同样的事情,但条件较差,你可以这样做:

select * 
from mytable
where mycolumn = @myvar or ISNULL(mycolumn,'') = ''

但是这不会在mycolumn上使用索引(如果有的话)。

答案 2 :(得分:2)

你正在写

select * from mytable where (mycolumn = @myvar and mycolum is not null) or 
   mycolumn is null or mycolumn =''

因为如果mycolumn为NULL,那么它是真的,你不需要使用and mycolum is not null来防范它,所以它可以简化为;

SELECT * FROM mytable 
WHERE mycolumn IS NULL OR mycolumn ='' OR mycolumn = @myvar