упорядочить набор результатов в неестественном порядке - PullRequest
3 голосов
/ 17 января 2012

Я понимаю нормальное предложение ASC и DESC ORDER BY.

Однако у меня есть случай, когда таблица содержит столбец unitType, где unitType может быть 0, 1 или 2. Мне нужно отсортировать мой набор результатов так, чтобы возвращаемые строки были в определенном порядке в зависимости отзначение столбца unitType.

Это самое близкое, что я получил:

SELECT * FROM `units` WHERE `unitType`=0
union 
select * from units where unitType=2
union 
select * from units where unitType=1

Здесь перечислены мои строки с unitType=0, за которыми следуют те со значением 2 и, наконец, 1. Есть ли лучший способ сделать это?Мне нужно изменить этот запрос, чтобы получить строки в любом конкретном порядке, например, 2, 0, 1 и т. Д.

Ответы [ 5 ]

6 голосов
/ 17 января 2012
SELECT *
    FROM units
    WHERE unitType IN (0,1,2)
    ORDER BY CASE WHEN unitType = 0 THEN 1
                  WHEN unitType = 2 THEN 2
                  WHEN unitType = 1 THEN 3
             END 
3 голосов
/ 17 января 2012

Вы также можете использовать функцию FIELD():

SELECT * 
FROM units 
ORDER BY FIELD(unitType, 0,2,1)
2 голосов
/ 17 января 2012

Я бы создал отдельную таблицу SortOrder (UnitType, Ordinal) и использовал ее для определения порядка.Затем вы используете UnitType, чтобы присоединиться к этой таблице и упорядочить результаты по Ordinal.

2 голосов
/ 17 января 2012
select * from units
order by
  case when unitType = 0 then 1
       when unitType = 1 then 3
       else 2 end
1 голос
/ 18 января 2012

Вместо того, чтобы «скрывать» эту логику в предложении ORDER BY запроса, рассмотрите возможность создания таблицы для сопоставления unitType и значений порядка сортировки (например, базовой таблицы из двух столбцов), присоединитесь к этой таблице в запросах и включите Атрибут порядка сортировки в предложении SELECT и в предложении ORDER BY (для представления порядка сортировки вызывающему приложению).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...