Условный 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
Я не знаю, эффективнее ли форсирование сортировки по равномерному столбцу, чем вывод чисел из отсортированных строк, хотя
Ответы
Ответ 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