Подтвердить что ты не робот

Динамический порядок по SELECT с несколькими столбцами

Каков правильный синтаксис 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
4b9b3361

Ответ 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 

Ответ 2

@Брэд. Павел предлагал следующее (я думаю),

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 имеет свои недостатки, но я бы рекомендовал вам хотя бы попробовать, если он сработает для вас.

Ответ 3

Попробуйте это как меньшее влияние на производительность сервера - если у вас есть только 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

Ответ 4

Сделайте это... и попрощайтесь с вашей работой. К сожалению, лучшим решением является использование динамического sql.

Ответ 5

Вы можете переписать это:

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