我正在努力实现以下目标:
我有一个ORDER BY语句,可能会根据存储在A列中的值而有所不同。
例如:
如果Type是Member,则按成员姓氏排序 如果“类型”为“组”,则按“组名”
排序均按升序排列。
我对最终陈述的最佳猜测是:
SELECT *
FROM table
WHERE STATUS = 'Active'
ORDER BY ((LNAME if TYPE = 'Member') OR (GROUPNAME if TYPE = 'Group')) ASC
我知道这是不正确的,但无法在其他地方找到信息。有什么想法吗?
答案 0 :(得分:61)
好吧,你可以在MySQL中使用IF
function(注意强调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
出现在块之后,而不是在块内部... ...
答案 1 :(得分: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;