Можете ли вы добавить инструкцию if в ORDER BY?

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

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

Например:

если Тип является членом, сортировка по имени члена, если Тип является Группой, сортировка по имени группы

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

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

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

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

Ну, вы можете использовать функцию 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 приходит после блока, а не внутри него) …

Используйте оператор 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;