SQL 如果变量不为空则有条件连接
SQL Conditional Join if Variable is Not NULL
我有一些变量集,看起来像这样:
SET @ItemID1 = 3
SET @ItemID2 = 26
SET @ItemID3 = NULL
SET @ItemRadius1 = 5000
SET @ItemRadius2 = 5000
SET @ItemRadius3 = NULL
ItemID 是一个查找字段,半径是以米为单位的距离。例如,查询应该 return 5000 米范围内的所有资产,ID 为@ItemID1。
如果 "Geo" 字段(地理类型)之间的距离小于输入的半径,我的查询当前正在加入。
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)
我的问题是,这是作为过程设置的,声明的变量可能为空。如果他们是我的查询将 return 没有结果。有没有办法 运行 只有 @ItemID3 IS NOT NULL AND @ItemRadius3 IS NOT NULL
的条件。我曾尝试将我的结果选择到已声明的 table 中,然后 运行 在已声明的 table 上加入连接,但我的结果未正确过滤。如有任何建议,我们将不胜感激。
我建议将查询写成:
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
.
的开销
我有一些变量集,看起来像这样:
SET @ItemID1 = 3
SET @ItemID2 = 26
SET @ItemID3 = NULL
SET @ItemRadius1 = 5000
SET @ItemRadius2 = 5000
SET @ItemRadius3 = NULL
ItemID 是一个查找字段,半径是以米为单位的距离。例如,查询应该 return 5000 米范围内的所有资产,ID 为@ItemID1。
如果 "Geo" 字段(地理类型)之间的距离小于输入的半径,我的查询当前正在加入。
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)
我的问题是,这是作为过程设置的,声明的变量可能为空。如果他们是我的查询将 return 没有结果。有没有办法 运行 只有 @ItemID3 IS NOT NULL AND @ItemRadius3 IS NOT NULL
的条件。我曾尝试将我的结果选择到已声明的 table 中,然后 运行 在已声明的 table 上加入连接,但我的结果未正确过滤。如有任何建议,我们将不胜感激。
我建议将查询写成:
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
.