我有一个包含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
由于
答案 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