SQL SERVER:检查变量是否为null,然后为Where子句分配语句

时间:2013-04-18 14:54:50

标签: sql sql-server sql-server-2008 tsql case

我正在尝试在sql中的WHERE子句中实现类似下面的内容。

if (@zipCode ==null)
begin
([Portal].[dbo].[Address].Position.Filter(@radiusBuff) = 1)   
end
else if(@zipCode !=null)
begin
([Portal].[dbo].[Address].PostalCode=@zipCode )
end  

我尝试了以下内容:

WHERE ((@zipCode IS NOT NULL AND ([Portal].[dbo].[Address].PostalCode=@zipCode)) OR (@zipCode IS NULL AND ([Portal].[dbo].[Address].Position.Filter(@radiusBuff) = 1)))

这是错误的。任何人都可以帮助构建确切的声明。谢谢!

5 个答案:

答案 0 :(得分:12)

为null是我用于此类事情的语法,当COALESCE没有帮助时。

尝试:

if (@zipCode is null)
  begin
    ([Portal].[dbo].[Address].Position.Filter(@radiusBuff) = 1)   
  end
else 
  begin
    ([Portal].[dbo].[Address].PostalCode=@zipCode )
  end  

答案 1 :(得分:8)

为这种事情内置了Isnull()语法。

declare @Int int = null;

declare @Values table ( id int, def varchar(8) )

insert into @Values values (8, 'I am 8');

-- fails
select *
from @Values
where id = @Int

-- works fine
select *
from @Values
where id = isnull(@Int, 8);

对于您的示例请记住,您可以将范围更改为另一个谓词,其中谓词来自复杂布尔逻辑的不同变量。如果您需要检查不同的数据类型,则只需要注意不同的方法。因此,如果我添加另一行但希望指定int为8并且还有类似于'repeat'的文本引用,我可以使用引用再次返回第一个变量的'isnull'但返回完全不同的结果数据类型对不同领域的不同引用。

declare @Int int = null;

declare @Values table ( id int, def varchar(16) )

insert into @Values values (8, 'I am 8'), (8, 'I am 8 repeat');

select *
from @Values
where id = isnull(@Int, 8)
and def like isnull(cast(@Int as varchar), '%repeat%')

答案 2 :(得分:1)

尝试案例陈述

WHERE
CASE WHEN @zipCode IS NULL THEN 1
ELSE @zipCode
END

答案 3 :(得分:0)

为null可用于检查空数据是否来自查询,如下例

 declare @Mem varchar(20),@flag int
select @mem=MemberClub from [dbo].[UserMaster] where UserID=@uid
if(@Mem is null)
begin
    set @flag= 0;
end
else
begin
    set @flag=1;
end
return @flag;

答案 4 :(得分:0)

如果((从PageImage中选择VisitCount,其中PID = @ pid和PageNumber = 5)为NULL)     开始         更新PageImage设置         VisitCount = 1         其中PID = @ pid和PageNumber = @ pageno     结束     其他     开始         更新PageImage设置         VisitCount = VisitCount + 1         其中PID = @ pid和PageNumber = @ pageno     结束