ПОРЯДОК ПО дискретным значениям текстового столбца в [Моем] SQL [ite]

#mysql #sqlite #sorting #sql-order-by

#mysql #sqlite #сортировка #sql-порядок по

Вопрос:

Я хотел бы отсортировать строки в таблице на основе произвольного упорядочения ограниченного набора значений текстового (или перечисляемого) столбца. Например, если столбец «Классы» может иметь значения A, B, C, D, я хотел бы иметь возможность сортировать строки по A> C > B> D или по какой-либо другой комбинации, а не только по алфавиту или по собственному порядку перечисления. Это вообще возможно?

В идеале я хотел бы решение, которое работает на SQLite, но также было бы полезно решение MySQL. Большое спасибо!

Ответ №1:

 ORDER BY field(column, 'A', 'C', 'B', 'D')
  

Функция ПОЛЯ в документах MySQL

Ответ №2:

Если MySQL и sqlite допускают использование РЕГИСТРА в предложениях ORDER BY (MSSQL делает, и я не вижу причин, по которым другие системы этого не сделают), вы могли бы использовать что-то вроде:

 ORDER BY CASE
         WHEN classes ='A' THEN 1
         WHEN classes ='C' THEN 2
         WHEN classes ='B' THEN 3
         WHEN classes ='D' THEN 4
         ELSE 5
         END CASE
  

Если столбец может содержать более одного из параметров в любом определенном порядке, вы также могли бы сделать:

 ORDER BY CASE
         WHEN classes LIKE '%A%' THEN 1
         WHEN classes LIKE '%C%' THEN 2
         WHEN classes LIKE '%B%' THEN 3
         WHEN classes LIKE '%D%' THEN 4
         ELSE 5
         END CASE
  

хотя перегрузка такого поля не является обычной формой и обычно не рекомендуется.

Комментарии:

1. Хотя это и не так элегантно, как функции FIELD или FIND_IN_SET MySQL, это действительно работает на SQLite (без окончательного ВАРИАНТА). Спасибо!

2. Я также обнаружил, что форма: «ПОРЯДОК ПО классам регистров, КОГДА ‘A’, ЗАТЕМ 1, КОГДА ‘B’, ЗАТЕМ 2 …» также работает, выглядит немного лучше и может быть немного более эффективной.

3. Да, последний ВАРИАНТ также не используется в MSSQL, но, если я правильно помню (прошло некоторое время с тех пор, как я использовал MySQL для своего собственного кода), он требуется MySQL.

4. Да, СЛУЧАЙ <что-то>, КОГДА форма <константа> является допустимым сокращением, когда вам не нужны никакие сравнения, кроме «равно».

Ответ №3:

Еще один вариант — добавить новый (временный?) таблица, такая как

 class | rank
A     | 1
B     | 2
C     | 3
D     | 4
  

Затем вы можете объединить таблицу по class столбцу и упорядочить по rank .