Заявление CASE для порядка заказа с несколькими столбцами и дескриптором /Asc Sort

Следуя моему предыдущему вопросу здесь Оператор case для предложения Order By с сортировкой Desc/Asc У меня есть инструкция вроде этого:

SELECT 
    *
FROM
    TableName
WHERE
ORDER BY 
    CASE @OrderByColumn WHEN 1 THEN Forename END DESC, 
    CASE @OrderByColumnWHEN 2 THEN Surname END ASC 

Это работает хорошо, но иногда мне нужно больше, чем столбец в порядке. Мне действительно нужно что-то вроде этого:

.....
ORDER BY
    CASE @OrderByColumn WHEN 1 THEN Forename, Date, Location END DESC

Я не могу понять, как сделать оператор CASE разрешить несколько столбцов в части THEN.

Ответ 1

Вам это нужно?

ORDER BY
    CASE @OrderByColumn WHEN 1 THEN Forename END DESC, Date, Location,
    CASE @OrderByColumn WHEN 2 THEN Surname END ASC 

Ответ 2

Вы можете написать несколько случаев, даже если они все имеют одинаковое условие.

ORDER BY 
    CASE @OrderByColumn WHEN 1 THEN Forename END DESC, 
    CASE @OrderByColumn WHEN 1 THEN Date END DESC, 
    CASE @OrderByColumn WHEN 1 THEN Location END DESC, 
    CASE @OrderByColumn WHEN 2 THEN Surname END ASC 

На самом деле вы указываете не столбец для сортировки, а выражение.

Оператор case возвращает ноль, если условие не выполняется, поэтому на самом деле это означает:

CASE @OrderByColumn WHEN 1 THEN Forename ELSE NULL END

Так что если @OrderByColumn не равно 1, то оператор всегда возвращает NULL. Между прочим, это не исключает его из сортировки, но объединяет все эти строки в результате, делая SurName решающей сортировкой в этой группе строк.