#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня есть следующий код SQL:
SELECT
*
FROM
#temp_SuspenseResults
ORDER BY
(CASE When @SortBy = 'DueDate' and @SortDir = 0 THEN DueDate END) ASC,
(CASE When @SortBy = 'DueDate' and @SortDir = 1 THEN DueDate END) DESC,
(CASE When @SortBy = 'DBAction' and @SortDir = 0 THEN DBAction END) ASC,
(CASE When @SortBy = 'DBAction' and @SortDir = 1 THEN DBAction END) DESC,
(CASE When @SortBy = 'State' and @SortDir = 0 THEN State END) ASC,
(CASE When @SortBy = 'State' and @SortDir = 1 THEN State END) DESC,
(CASE When @SortBy = 'FirstName' and @SortDir = 0 THEN FirstName END) ASC,
(CASE When @SortBy = 'FirstName' and @SortDir = 1 THEN FirstName END) DESC,
(CASE When @SortBy = 'LastName' and @SortDir = 0 THEN LastName END) ASC,
(CASE When @SortBy = 'LastName' and @SortDir = 1 THEN LastName END) DESC
OFFSET
@PageStart ROWS
FETCH NEXT
@PageSize ROWS ONLY;
Я получил новое требование, которое мне нужно сортировать по нескольким параметрам. Я знаю, что мы можем упорядочивать по нескольким параметрам, таким как
Select * from #temp_SuspenseResults order by DueDate, DbAction
Но если у меня есть
Declare @SortBy Varchar(100) = 'DueDate,DbAction'
Как мне выполнить сортировку по нескольким значениям, поскольку @SortBy
это единственное значение параметра. Любые предложения или идеи будут с благодарностью приняты. Заранее спасибо
Комментарии:
1. Короткий ответ — динамический sql. У вас уже есть один вопрос с примерами. Адаптируйте это для обработки сортировки. Предположительно, вы не учли то же самое изменение в вашем параметре направления?
2. Производительность этого запроса, вероятно, будет довольно низкой, поскольку никакие индексы не могут эффективно использоваться при сортировке (конечно, подкачка, предлагаемая
OFFSET
/,FETCH NEXT
сама по себе является проблемой производительности, если вы просматриваете очень много строк, но это другой вопрос). Я рекомендую прочитать это для получения дополнительной справочной информации о том, как писать эффективные динамические запросы (в нем конкретно рассматриваются параметры дляWHERE
, но большая часть того же самого применима кORDER BY
предложениям). В конечном итоге вам может даже не понадобиться временная таблица.
Ответ №1:
Я исправил эту проблему, выполнив следующее:
Declare @SortBy VARCHAR(50) = 'DueDate,DbAction'
Select value into #SortParams from string_split(@SortBy, ',')
SELECT --top 100
*
FROM
#temp_SuspenseResults
ORDER BY
(CASE When 'DueDate' in (Select value from #SortParams) and @SortDir = 0 THEN DueDate END) ASC,
(CASE When 'DueDate' in (Select value from #SortParams) and @SortDir = 1 THEN DueDate END) DESC,
(CASE When 'DBAction' in (Select value from #SortParams) and @SortDir = 0 THEN DBAction END) ASC,
(CASE When 'DBAction' in (Select value from #SortParams) and @SortDir = 1 THEN DBAction END) DESC,
(CASE When 'State' in (Select value from #SortParams) and @SortDir = 0 THEN State END) ASC,
(CASE When 'State' in (Select value from #SortParams) and @SortDir = 1 THEN State END) DESC,
(CASE When 'FirstName' in (Select value from #SortParams) and @SortDir = 0 THEN FirstName END) ASC,
(CASE When 'FirstName' in (Select value from #SortParams) and @SortDir = 1 THEN FirstName END) DESC,
(CASE When 'LastName' in (Select value from #SortParams) and @SortDir = 0 THEN LastName END) ASC,
(CASE When 'LastName' in (Select value from #SortParams) and @SortDir = 1 THEN LastName END) DESC,
Комментарии:
1. Есть ли на самом деле какое-либо значение в выборе нескольких столбцов сортировки, когда порядок столбцов в конечном итоге фиксирован?