Можете ли вы добавить оператор if в ORDER BY? - PullRequest
34 голосов
/ 23 августа 2010

Я пытаюсь добиться следующего:

У меня есть один оператор ORDER BY, который может варьироваться в зависимости от значения, хранящегося в столбце A.

Например:

если тип является членом, сортировать по фамилии члена если типом является группа, сортировка по имени группы

оба в порядке возрастания.

Мое лучшее предположение для окончательного утверждения было бы:

SELECT * 
  FROM table 
 WHERE STATUS = 'Active' 
 ORDER BY ((LNAME if TYPE = 'Member') OR (GROUPNAME if TYPE = 'Group')) ASC

Я знаю, что это неправильно, но не могу найти информацию в другом месте. Есть идеи?

Ответы [ 2 ]

62 голосов
/ 23 августа 2010

Ну, вы можете использовать функцию IF в MySQL (обратите внимание на function, поскольку есть также не связанный IF оператор ) ...:

ORDER BY IF(TYPE='Member', LNAME, GROUPNAME) ASC

Однако в этом случае, похоже, лучшим выбором (с точки зрения гибкости) будет выражение CASE :

ORDER BY 
    CASE `type` 
        WHEN 'Member' THEN LNAME 
        WHEN 'Group' THEN GROUPNAME
        ELSE 1 END 
    ASC

Обратите внимание, что весь блок от CASE до END следует рассматривать как одну "единицу". Результатом является то, против чего вы пытаетесь отсортировать (следовательно, почему ASC идет после блока, а не внутри него) ...

10 голосов
/ 23 августа 2010

Используйте оператор CASE.

Пример из http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html:

SELECT id, first_name, last_name, birthday
FROM table
ORDER BY
-- numeric columns
CASE _orderby WHEN 'id' THEN id END ASC,
CASE _orderby WHEN 'desc_ id' THEN id END DESC,
-- string columns
CASE _orderby WHEN 'first_name' THEN first_name WHEN 'last_name' THEN last_name END ASC,
CASE _orderby WHEN 'desc_first_name' THEN first_name WHEN 'desc_last_name' THEN last_name END DESC,
-- datetime columns
CASE _orderby WHEN 'birthday' THEN birthday END ASC,
CASE _orderby WHEN 'desc_ birthday' THEN birthday END DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...