Проблема сортировки запросов при сортировке по столбцу с псевдонимом - PullRequest
0 голосов
/ 29 марта 2019

У меня есть процедура вычисления географического расстояния в SQL Server, но в ней есть псевдоним столбца и не может работать свойство сортировки true;

DECLARE
    @GEO1 GEOGRAPHY,
    @LAT VARCHAR(10),
    @LONG VARCHAR(10)

SET @LAT = '41.000000'
SET @LONG = '30.000000'

SET @geo1 = geography::Point(@LAT, @LONG, 4326)

SELECT 
    LOC_ID, LOC_NAME,
    LEFT(CONVERT(VARCHAR, (@geo1.STDistance(geography::Point(ISNULL(LAT,0), ISNULL(LONG, 0), 4326))) / 1000), 4) AS DISTANCE
FROM
    Konum
WHERE 
   (@geo1.STDistance(geography::Point(ISNULL(LAT,0), ISNULL(LONG,0), 4326))) / 1000 < 10

Я попытался

DECLARE
    @GEO1 GEOGRAPHY,
    @LAT VARCHAR(10),
    @LONG VARCHAR(10)

SET @LAT = '41.329867'
SET @LONG = '36.264149'

SET @geo1= geography::Point(@LAT, @LONG, 4326)

SELECT 
    LOC_ID, LOC_NAME,
    LEFT(CONVERT(VARCHAR, (@geo1.STDistance(geography::Point(ISNULL(LAT, 0), ISNULL(LONG, 0), 4326))) / 1000), 4) AS DISTANCE
FROM
    Konum
WHERE 
    (@geo1.STDistance(geography::Point(ISNULL(LAT, 0), ISNULL(LONG, 0), 4326))) / 1000 < 30
ORDER BY 
    DISTANCE ASC -- <=

Но вернул псевдоним varcharcolumn

1.2
1.3
11.5 <= Not like
2.8
9.7

Я пытался:

CAST(DISTANCE AS INT)

Но SMSS выдает ошибку "недопустимое имя столбца" DISTANCE "", потому что это псевдоним столбца.

Какрешить эту проблему?

1 Ответ

0 голосов
/ 29 марта 2019

Ваш столбец расстояния в настоящее время является строкой и поэтому сортируется как таковой. Удалите преобразование строки (LEFT(CONVERT(VARCHAR), и оно будет правильно отсортировано.

DECLARE @GEO1 GEOGRAPHY, @LAT VARCHAR(10) = '41.329867', @LONG VARCHAR(10) = '36.264149'

SET @geo1= geography::Point(@LAT, @LONG, 4326)

SELECT LOC_ID, LOC_NAME
  , (@geo1.STDistance(geography::Point(ISNULL(LAT,0), 
  ISNULL(LONG,0), 4326)))/1000 as DISTANCE
from Konum
WHERE (@geo1.STDistance(geography::Point(ISNULL(LAT,0), ISNULL(LONG,0), 4326)))/1000 < 30
order by DISTANCE ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...