2015-01-12 3 views
0

Я хочу показать результаты в соответствии с расстоянием, например. если расстояние меньше 300, чем результаты до 300. Если это не менее 300, чем только второе условие, которое ниже 400.Условное утверждение, в котором положение не работает

Но я получаю все результаты, например. 118.149.357

мой внутренний выберите оператор возвращает расстояние через функцию

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 

ответ

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
WHERE (A.Distance <= 300 OR A.Distance <= 400) 

может быть упрощена

WHERE A.Distance <= 400 

потому что 300 <= 400 и, следовательно, ваш результат является правильным.

+0

Это верно и бесполезно, я думаю: он сообщает OP, что не так, но даже не намек на то, как переписать условие, чтобы получить желаемый результат. – hvd

+0

Желаемый результат: 'A.Distance <= 400', очевидно. – Smutje

+0

да, но .. я сначала ищу 300 метров .. и если я получаю результаты с 300, то я должен игнорировать 400 метров. – user1037747

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 

Отказа: непроверенный, может иметь тривиальные ошибки, но общий подход должен работать.

Смежные вопросы