我有一些变量集可能看起来像这样:
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
时运行条件。我已经尝试将我的结果选择到声明的表中,然后在声明的表上运行连接,但我的结果没有正确过滤。任何建议将不胜感激。
答案 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
的开销。