2010-08-23 2 views
29

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

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

Например:

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

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

Моя догадка для итогового заявления будет:

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

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

+0

Возможно, ваш запрос вернет оба типа? И если бы вы не сказали, что есть два разных запроса по одному для каждого типа, тогда его легко сделать заказ по условию для каждого. – Iznogood

+0

@iznogood - мы делаем это в том случае, если тип или вид известны раньше времени (подумайте о сортировке по букве имени), но это, похоже, не работает в данном конкретном случае. Например: \t \t \t \t \t \t \t \t $ запрос = «SELECT * FROM таблицы WHERE STATUS = 'Активный' AND ((LNAME LIKE 'A%' AND PARTY = 'член') OR (GROUPNAME LIKE«A% 'AND PARTY =' Group ')) ORDER BY KDATE ASC "; работает \t \t \t \t \t \t \t \t} – JM4

+0

@ JM4: Вы измените 'столбец KDATE' к более соответствующей колонке типа еще (Такие, как либо' 'date' или DATETIME')? – ircmaxell

ответ

57

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

+0

Возможно, я злоупотребляю, но получаю сообщение об ошибке при использовании предложенного формата как: «ВЫБЕРИТЕ * ОТ таблицы ГДЕ СОСТОЯНИЕ =« Активный »ЗАКАЗ ПО СЛУЧАЮ ТИПА КОГДА« ЧЕЛОВЕК »ТОГДА LNAME ASC КОГДА« Группа »THEN GROUPNAME ASC ELSE 1 END " – JM4

+1

Nooo,' ASC' идет после 'END'. Извините, я отредактирую ответ, чтобы сделать это более понятным ... – ircmaxell

+1

На самом деле я пошел с верхним предложением выше, так как он идеально вписывается в меньшее количество шагов. Благодаря! – JM4

10

Используйте инструкцию 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; 
+0

«_orderby», конечно же, является именем параметра ... извините, если это не было ясно из примера. – Andy

+3

Этот метод работал наилучшим образом для меня, потому что он обладает гибкостью, позволяя вам устанавливать ASC/DESC индивидуально, а не для всей группы. –

+0

Рад, что я мог помочь! Вот почему я сделал это так. – Andy

Смежные вопросы