11

我正在尝试在 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)))

这是错误的。任何人都可以帮助制定确切的陈述。谢谢!

4

5 回答 5

19

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

尝试:

if (@zipCode is null)
  begin
    ([Portal].[dbo].[Address].Position.Filter(@radiusBuff) = 1)   
  end
else 
  begin
    ([Portal].[dbo].[Address].PostalCode=@zipCode )
  end  
于 2013-04-18T16:16:52.317 回答
9

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);

对于您的示例,请记住,您可以将范围更改为另一个用于复杂布尔逻辑的不同变量的谓词。唯一需要注意的是,如果您需要检查不同的数据类型,则需要对其进行不同的转换。因此,如果我添加另一行但希望指定 8 的 int 以及类似于“重复”的文本的引用,我可以再次引用回到第一个变量的“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%')
于 2013-04-18T15:46:59.997 回答
2

尝试案例陈述

WHERE
CASE WHEN @zipCode IS NULL THEN 1
ELSE @zipCode
END
于 2013-04-18T15:21:51.720 回答
2

is null可用于检查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;
于 2017-08-25T10:28:44.730 回答
1

尝试以下操作:

if ((select VisitCount from PageImage where PID=@pid and PageNumber=5) is NULL)
begin
    update PageImage
    set VisitCount=1
    where PID=@pid and PageNumber=@pageno
end 
else
begin
    update PageImage 
    set VisitCount=VisitCount+1
    where PID=@pid and PageNumber=@pageno
end
于 2019-06-04T06:21:26.203 回答