Можете ли вы добавить инструкцию if в ORDER BY?
Я пытаюсь добиться следующего:
У меня есть один оператор ORDER BY, который может меняться в зависимости от значения, хранящегося в столбце A.
Например:
если Type является членом, сортировка по фамилии участника
если Тип является Группой, выполните сортировку по имени группы
как в порядке возрастания.
Мое лучшее предположение для окончательного утверждения было бы следующим:
SELECT *
FROM table
WHERE STATUS = 'Active'
ORDER BY ((LNAME if TYPE = 'Member') OR (GROUPNAME if TYPE = 'Group')) ASC
Я знаю, что это неверно, но не может найти информацию в другом месте. Любые идеи?
Ответы
Ответ 1
Хорошо, вы можете использовать IF
функцию в MySQL (обратите внимание на акцент на function
, поскольку там также несвязанный IF
statement)...:
ORDER BY IF(TYPE='Member', LNAME, GROUPNAME) ASC
Однако в этом случае лучший выбор (с точки зрения гибкости) будет CASE
statement:
ORDER BY
CASE `type`
WHEN 'Member' THEN LNAME
WHEN 'Group' THEN GROUPNAME
ELSE 1 END
ASC
Обратите внимание, что весь блок от CASE
до END
следует рассматривать как единую "единицу". Результатом этого является то, что вы пытаетесь сортировать против (поэтому почему ASC
появляется после блока, а не внутри него)...
Ответ 2
Используйте оператор 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;