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

Kri*_*shh 7 sql t-sql sql-server case sql-server-2008

我试图在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  
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

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

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

小智 13

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

尝试:

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


dja*_*azz 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);
Run Code Online (Sandbox Code Playgroud)

对于您的示例,请记住,您可以将范围更改为另一个谓词,其中谓词来自复杂布尔逻辑的不同变量.如果您需要检查不同的数据类型,则只需要注意不同的方法.因此,如果我添加另一行但希望指定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%')
Run Code Online (Sandbox Code Playgroud)