Заказ по ASC или DESC на основе параметра? - PullRequest
0 голосов
/ 21 мая 2019

В следующем запросе я использую @IsDescOrder, чтобы установить порядок.

Я пытаюсь указать order by (то есть. ASC или DESC), но получаю ошибку. Я могу удалить DESC | ASC, но оба варианта вернут один и тот же набор, потому что он вернет порядок по умолчанию:

declare @IsDescOrder bit = 0

;with cte as 
(
 select 
 *
 from (
  select *, r = row_number() over (partition by NameId 
  order by 
      case @IsDescOrder 
        when 1 then size_mbps DESC,
        when 0 then size_mbps ASC
      end
  ) 
  from #temp_table 
  ) a 
 where r <= 20
)
select 
* from 
cte 

Я получаю сообщение об ошибке Incorrect syntax near the keyword 'DESC'..

Есть ли обходной путь?

Ответы [ 2 ]

4 голосов
/ 21 мая 2019

У вас правильная идея, но вам просто нужно немного изменить способ, которым ваш CASE работает:

ORDER BY
  CASE WHEN @IsDescOrder = 1 THEN DateKey ELSE '' END DESC,
  CASE WHEN @IsDescOrder = 0 THEN DateKey ELSE '' END ASC

Это содержит два предложения для упорядочения: предложение в порядке убывания, затем в порядке возрастания.

Когда @IsDescOrder равен 1, используется нисходящее предложение, в противном случае - восходящее.Предоставляя ELSE '', это обеспечивает эффективное игнорирование нежелательного заказа (ASC или DESC).

EDIT

Как указано в OP, это вызвало ошибку, если столбец заказа был числовым.Чтобы решить эту проблему, замените пустую строку ('') на 0:

ORDER BY
  CASE WHEN @IsDescOrder = 1 THEN DateKey ELSE 0 END DESC,
  CASE WHEN @IsDescOrder = 0 THEN DateKey ELSE 0 END ASC

Это работает так же, как решение с пустой строкой, но предотвращает ошибку преобразования типов при использовании числовыхстолбцы.

0 голосов
/ 21 мая 2019
DECLARE @IsDescOrder bit = 1
DECLARE @sql VARCHAR(MAX) = 'SELECT TOP 10 i FROM TEST'
SET @sql = @sql + CASE WHEN @IsDescOrder=1 THEN ' ORDER BY i DESC' ELSE ' ORDER BY i ASC' END
EXEC sp_sqlexec @sql

То, что вы хотите, это «динамический» SQL-оператор. MSSQL делает только то, что вы используете 'sp_sqlexec' (AFAIK)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...