Можно ли расставить приоритеты сортировки столбцов в SQL на основе внешней таблицы - PullRequest
0 голосов
/ 09 июля 2019

Я работаю с таблицей, в которой есть несколько столбцов, которые могут быть отсортированы в зависимости от настроек пользователя.Я пытаюсь найти способ избежать динамического SQL и сохранить строку сортировки в таблице предпочтений.

Пример данных, с которыми я работаю:

User   |  VIP  |  Date    | Priority  |  Location
---------------------------------------------------
 Jim   |   1   | 1/1/2019 |    0      |    105
 Joe   |   0   | 2/1/2019 |    0      |    104
 Jack  |   1   | 1/5/2019 |    1      |    105
 John  |   0   | 2/6/2019 |    1      |    106
 Jane  |   0   | 4/1/2019 |    1      |    105
 Jake  |   1   | 7/1/2019 |    0      |    105

Таблица сортировки будет выглядеть примерно так:

Column   |  SortOrder |  Location
------------------------------------
 VIP     |      2     |    105
 Date    |      1     |    105
Priority |      -1    |    105
 VIP     |      1     |    104
 Date    |      2     |    104
Priority |      3     |    104
 VIP     |      1     |    106
 Date    |      -1    |    106
Priority |      2     |    106

Мой запрос будет использовать расположение какпредложение where, поэтому я буду возвращать значения только для определенного местоположения, но я хотел бы отсортировать данные для этого местоположения на основе значений, установленных в таблице сортировки.

-1 будет неактивной сортировкой,так что если бы место было 105, я бы хотел заказать по дате, а затем по VIP.Если 104, VIP, затем Дата, затем Приоритет и если 106 VIP, то рассматривается Приоритет без Даты.

Я думал, что мог бы, возможно, сделать какую-то математическую вещь, но мне трудно придуматьалгоритм.

Я пытаюсь избежать жесткого кодирования Date ASC, VIP ASC в таблицу и извлечения и применения его с помощью динамического SQL (хотя у меня это работает, но я надеюсь на лучшее, неДинамическое решение).

У кого-нибудь есть предложения?

1 Ответ

2 голосов
/ 09 июля 2019

Вы не можете сделать это с математикой.

Вы можете либо использовать динамический SQL, как вы упомянули, либо использовать несколько CASES.

Сначала вам потребуется либо PIVOT, либо использовать подзапросы, либо какой-либо другой метод, чтобы получить виртуальные столбцы SortOrder длякаждый из столбцов вы можете заказать.Тогда вы могли бы сделать что-то вроде этого:

ORDER BY CASE 
  WHEN [VipSortOrder]=1 THEN [VIP]
  WHEN [DateSortOrder]=1 THEN [Date]
  WHEN [PrioritySortOrder]=1 THEN [Priority]
END,
  CASE {Same for the 2's} etc...

Если бы это был я, я бы лично использовал динамический sql.

...