Итак, это не обычный вопрос «условной сортировки» ... У меня тут довольно сложная проблема.:-) Я хочу разрешить моей хранимой процедуре предлагать условный порядок сортировки результатов.Обычно это можно сделать следующим образом:
SELECT *
INTO #ResultsBeforeSubset
FROM
MyTable
ORDER BY
CASE WHEN @SortAscending=1 THEN 'SortColumn' END ASC,
CASE WHEN @SortAscending=0 THEN 'SortColumn' END DESC
Я хотел бы сделать оператор CASE
вокруг фактического ASC
/ DESC
, но это не работает.Причина, по которой работает вышеуказанный метод, заключается в том, что, когда @SortAscending
не равно заданному значению, SQL-сервер преобразует оператор CASE
в константу NULL
.Итак, если @SortAscending
равно 0, вы фактически получаете:
ORDER BY
NULL ASC,
SortColumn DESC
Первое выражение сортировки просто ничего не делает.Это работает, потому что в обычном операторе SELECT
вы можете использовать константу в предложении ORDER BY
.
Проблема в том, что время, которое я сортирую в моем сохраненном процессе, находится во время оператора SELECT
, который содержитоконная функция ROW_NUMBER()
.Поэтому я хочу поместить оператор CASE
в его предложение OVER
, например, так:
SELECT *
INTO #ResultsBeforeSubset
FROM (
SELECT
ROW_NUMBER() OVER (
ORDER BY
CASE WHEN @SortAscending=1 THEN rowValues.[SortColumn] END ASC,
CASE WHEN @SortAscending=0 THEN rowValues.[SortColumn] END DESC
) AS RowNumber,
*
FROM (
-- UNIONed SELECTs returning rows go here...
) rowValues
) rowValuesWithRowNum
К сожалению, это вызывает следующую ошибку при запуске хранимой процедуры:
Windowed functions do not support constants as ORDER BY clause expressions.
Поскольку это условие оконной функции, преобразование оператора CASE
в константу NULL
недопустимо.
Может кто-нибудь придумать способ, которым я могу условно изменить порядок сортировкиUNION
ed SELECT
s, и назначить номера строк каждой строке, полученной в результате этих отсортированных результатов?Я знаю, что могу прибегнуть к построению всего запроса в виде строки и выполнить его как полностью динамический SQL, но я бы предпочел этого избежать, если это возможно.
ОБНОВЛЕНИЕ: Похожепроблема была не в операторе CASE
per se , а в том, что я использовал только постоянные значения в условном предложении оператора CASE
.Я задал новый вопрос об этом любопытном поведении здесь .