Итак, это не обычный вопрос "условной сортировки по" ... У меня здесь довольно сложная проблема. :-) Я хочу, чтобы моя хранимая процедура предлагала условный порядок сортировки результатов. Обычно это можно сделать следующим образом:
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, но я бы предпочел избежать этого, если возможно.
UPDATE: Похоже, проблема не была вызвана Оператор CASE
как таковой , но потому, что я использовал только постоянные значения в условном предложении оператора CASE
. Я задал новый вопрос об этом любопытном поведении здесь .