2017-12-07 8 views
0

されていない場合、私はこのような何かを見ることができるいくつかの変数のセットがあります。SQL条件付きで参加変数がNULL

SET @ItemID1 = 3 
SET @ItemID2 = 26 
SET @ItemID3 = NULL 
SET @ItemRadius1 = 5000 
SET @ItemRadius2 = 5000 
SET @ItemRadius3 = NULL 

をアイテムIDは、ルックアップフィールドで、半径はメートルの距離です。例えば、クエリは、@ ItemID1のIDを持つアイテムの5000メートル以内のすべてのアセットを返す必要があります。

"ジオ"フィールド(地理タイプ)の間の距離が半径が入力されているものより小さい場合は、現在クエリに参加しています。

SELECT DISTINCT 
    a.AssetID, 
    a.Name 
    FROM Asset a 
    JOIN Item i1 ON ((a.Geo.STDistance(i1.Geo) < @ItemRadius1) AND i1.TypeID = @ItemID1) 
    JOIN Item i2 ON ((a.Geo.STDistance(i2.Geo) < @ItemRadius2) AND i2.TypeID = @ItemID2) 
    JOIN Item i3 ON ((a.Geo.STDistance(i3.Geo) < @ItemRadius3) AND i3.TypeID = @ItemID3) 

私の問題は、これがプロシージャとして設定されており、宣言された変数がnullである可能性があることです。それらが私の質問であれば結果は返されません。 @ItemID3 IS NOT NULL AND @ItemRadius3 IS NOT NULLの場合にのみ条件を実行する方法はありますか?私は宣言されたテーブルに結果を選択しようとしましたが、その宣言されたテーブルでジョインを実行しましたが、結果が正しくフィルタリングされませんでした。任意の提案をいただければ幸いです。私のようにクエリを書くことをお勧め

+0

トライtihs '... は 上のアイテムi3のを登録しよう(@ ItemRadius3がnullであるか、((a.Geo.STDistance(i3.Geo)<@ ItemRadius3)))と(ItemID3がnullまたはi3.TypeIDです@ = @ ItemID3) ' –

答えて

1

:非常に少なくとも

SELECT a.* 
FROM Asset a 
WHERE (@ItemID1 IS NULL OR ItemRadius1 IS NULL OR 
     EXISTS (SELECT 1 
       FROM Item i1 
       WHERE a.Geo.STDistance(i1.Geo) < @ItemRadius1 AND i1.TypeID = @ItemID1) 
    ) AND 
     (@ItemID2 IS NULL OR ItemRadius2 IS NULL OR 
     EXISTS (SELECT 1 
       FROM Item i2 
       WHERE a.Geo.STDistance(i2.Geo) < @ItemRadius2 AND i2.TypeID = @ItemID1) 
    ) AND 
     (@ItemID3 IS NULL OR ItemRadius3 IS NULL OR 
     EXISTS (SELECT 1 
       FROM Item i3 
       WHERE a.Geo.STDistance(i3.Geo) < @ItemRadius3 AND i3.TypeID = @ItemID1) 
    ) ; 

、これはSELECT DISTINCTのためのオーバーヘッドがなくなります。

+0

これはNULL値で正しくフィルタリングされているようです – Steve