Подтвердить что ты не робот

Можете ли вы добавить инструкцию 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

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

4b9b3361

Ответ 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;