Подтвердить что ты не робот

Условный SQL ORDER BY ASC/DESC для альфа-столбцов

Написание хранимой процедуры в MS SQL Server 2008 R2, я хочу избежать использования DSQL...

Я хотел бы, чтобы метод sort (ASC или DESC) был условным.

Теперь с числовым столбцом я бы просто использовал оператор case и отрицал значение для эмуляции ASC или DESC... То есть:

... ORDER BY CASE @OrderAscOrDesc WHEN 0 THEN [NumericColumn] ELSE -[NumericColumn] END ASC

Что такое подходящий метод для этого с альфа-столбцом?

EDIT: я подумал об умном способе, но это кажется ужасно неэффективным... Я мог бы вставить свой упорядоченный альфа-столбец в таблицу temp с помощью автонабора, а затем отсортировать по автономеру, используя описанный выше метод.

EDIT2:

Что вы, ребята, думаете об этом?

ORDER BY CASE @OrderAscOrDesc WHEN 0 THEN [AlphaColumn] ELSE '' END ASC,
CASE @OrderAscOrDesc WHEN 0 THEN '' ELSE [AlphaColumn] END DESC

Я не знаю, эффективнее ли форсирование сортировки по равномерному столбцу, чем вывод чисел из отсортированных строк, хотя

4b9b3361

Ответ 1

Один вариант

;WITH cQuery AS
(
   SELECT
       *,
       ROW_NUMBER() OVER (ORDER BY SortColumn) AS RowNum
   FROM
       MyTable
)
SELECT
   *
FROM
   cQuery
ORDER BY
   RowNum * @Direction --1 = ASC or -1 = DESC

Или CASE, которое IMHO немного уродливее

ORDER BY
  CASE WHEN 'ASC' THEN SortColumn ELSE '' END ASC,
  CASE WHEN 'DESC' THEN SortColumn ELSE '' END DESC

Ответ 2

Это один из тех случаев, когда конкретные решения могут быть предпочтительнее, чем общие, особенно когда мы имеем дело с большими объемами данных. Я бы:

IF @OrderAscOrDesc = 0 THEN BEGIN
  SELECT ...
  FROM  ... 
  ORDER BY [AlphaColumn] ASC
END ELSE BEGIN
  SELECT ...
  FROM  ... 
  ORDER BY [AlphaColumn] DESC
END

Если у вас есть указатель на [AlphaColumn], иногда вы можете получить более четкий план с более конкретным запросом, чем с универсальным одноразрядным.

Изменить: чтобы облегчить повторное использование кода, вы можете обернуть свой выбор в встроенный UDF - он будет работать так же хорошо:

IF @OrderAscOrDesc = 0 THEN BEGIN
  SELECT ...
  FROM  YourInlineUdf(...)
  ORDER BY [AlphaColumn] ASC
END ELSE BEGIN
  SELECT ...
  FROM  YourInlineUdf(...) 
  ORDER BY [AlphaColumn] DESC
END