where子句中的条件语句不起作用

时间:2015-01-12 14:29:45

标签: sql

我想根据距离显示结果,例如如果距离小于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

3 个答案:

答案 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因此您的结果是正确的。