如果变量不为空,则为SQL条件连接

时间:2017-12-07 20:54:23

标签: sql sql-server join spatial

我有一些变量集可能看起来像这样:

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

ItemID是查找字段,半径是以米为单位的距离。例如,查询应返回5000米范围内ID为@ ItemID1的项目的所有资产。

我的查询目前正在加入,如果“地理”字段(地理类型)之间的距离小于进入半径的距离。

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时运行条件。我已经尝试将我的结果选择到声明的表中,然后在声明的表上运行连接,但我的结果没有正确过滤。任何建议将不胜感激。

1 个答案:

答案 0 :(得分: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的开销。