我想根据距离显示结果,例如如果距离小于300而不是结果直到300.如果距离小于300而不是仅接受400以下的第二个条件。
但是我得到了所有结果,例如118149357
我的内部select语句通过函数返回距离
SELECT A.Id, A.Distance FROM
(
SELECT Id, ROUND((dbo.GetDistance(@Latitude, @Longitude, Latitude, Longitude)*1000),0) AS Distance
FROM Messages WITH (NOLOCK) where LEN(Latitude) > 0 AND LEN(Longitude) > 0
) A
WHERE
(A.Distance <= 300
OR
A.Distance <= 400)
ORDER BY Distance ASC
答案 0 :(得分:2)
试试这个。
;WITH cte
AS (SELECT Id,
Round(( dbo.Getdistance(@Latitude, @Longitude, Latitude, Longitude) * 1000 ), 0) AS Distance
FROM Messages WITH (NOLOCK)
WHERE Len(Latitude) > 0
AND Len(Longitude) > 0)
SELECT A.Id,
A.Distance
FROM cte a
WHERE A.Distance <= 300
OR ( A.Distance <= 400
AND NOT EXISTS (SELECT 1
FROM cte B
WHERE B.Distance <= 300) )
ORDER BY Distance ASC
答案 1 :(得分:0)
为每一行评估WHERE
子句。在过滤器中针对一个特定行,您不能将同一结果集中存在的其他行用作过滤器中的条件。
你必须重新思考你的方法。我能想到的一种方法是按距离对行进行排名,并选择前1名:
WITH cte1 AS (
SELECT Id, ROUND((dbo.GetDistance(@Latitude, @Longitude, Latitude, Longitude)*1000),0) AS Distance
FROM Messages WITH (NOLOCK)
WHERE LEN(Latitude) > 0 AND LEN(Longitude) > 0
), cte2 AS (
SELECT Id, Distance, RANK() OVER (ORDER BY CASE WHEN Distance <= 300 THEN 0 ELSE 1 END) AS [Rank]
FROM cte1
WHERE Distance <= 400
)
SELECT Id, Distance
FROM cte2
WHERE [Rank] = 1
ORDER BY Distance ASC
免责声明:未经测试,可能存在微不足道的错误,但一般方法应该有效。
答案 2 :(得分:-1)
WHERE (A.Distance <= 300 OR A.Distance <= 400)
可以简化为
WHERE A.Distance <= 400
因为300 <= 400
因此您的结果是正确的。