Ответ 1
Вы можете попробовать это
SELECT * FROM Products
ORDER BY
CASE WHEN @SortIndex = 1 THEN Price END ASC,
CASE WHEN @SortIndex = 2 THEN Price END DESC,
CASE WHEN @SortIndex = 2 THEN Title END ASC
Каков правильный синтаксис MS SQL для выбора нескольких столбцов ORDER BY, когда ORDER BY основан на инструкции CASE?
Ниже работает отлично с одиночными столбцами, но мне нужно сортировать по нескольким столбцам:
SELECT * FROM Products
ORDER BY
CASE WHEN @SortIndex = 1 THEN Price END ASC,
CASE WHEN @SortIndex = 2 THEN Price DESC, Title ASC END <-- problem line
Вы можете попробовать это
SELECT * FROM Products
ORDER BY
CASE WHEN @SortIndex = 1 THEN Price END ASC,
CASE WHEN @SortIndex = 2 THEN Price END DESC,
CASE WHEN @SortIndex = 2 THEN Title END ASC
@Брэд. Павел предлагал следующее (я думаю),
DECLARE @query VARCHAR(MAX)
SET @query = 'SELECT * FROM Products
ORDER BY
'
IF (@SortIndex = 1)
SET @query [email protected] + ' Price ASC '
ELSE IF (@SortIndex = 2)
SET @query [email protected] + ' Price DESC, Title ASC '
sp_executesql @query
Почему вы думаете, что динамический sql не подходит для сложных хранимых процедур? Это именно те места, где вы должны использовать динамический SQL, поскольку это может помочь уменьшить сложность и решить проблемы, такие как sniffing параметров. Я согласен с тем, что динамический sql имеет свои недостатки, но я бы рекомендовал вам хотя бы попробовать, если он сработает для вас.
Попробуйте это как меньшее влияние на производительность сервера - если у вас есть только 2 значения в @SortIndex (1 и 2). Если нет, расширьте If, если у вас больше условий.
If @SortIndex = 1
BEGIN
SELECT * FROM Products ORDER BY Price ASC
END
ELSE
BEGIN
SELECT * FROM Products ORDER BY Price DESC, TITLE ASC
END
Сделайте это... и попрощайтесь с вашей работой. К сожалению, лучшим решением является использование динамического sql.
Вы можете переписать это:
ORDER BY
CASE WHEN @SortIndex = 1 THEN Price END ASC,
CASE WHEN @SortIndex = 2 THEN Price DESC, Title ASC END
как
CASE WHEN @SortIndex = 1 THEN Price END ASC,
CASE WHEN @SortIndex = 2 THEN Price DESC END,
Title ASC
Это добавляет добавленный столбец сортировки ко всем случаям, но в моей ситуации это то, что я хотел.
Вы также можете сделать это (например):
CASE WHEN @SortIndex = 1 THEN Price END ASC,Title ASC,
CASE WHEN @SortIndex = 2 THEN Price DESC END