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

is null は、COALESCE が役に立たない場合に使用する構文です。

試す:

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 を指定し、さらに「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%')
于 2013-04-18T15:46:59.997 に答える
2

ケースステートメントを試す

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