能否在 ORDER BY 中添加 if 语句?

2022-08-30 11:01:09

我正在努力实现以下目标:

我有一个ORDER BY语句,该语句可能会根据列A中存储的值而有所不同。

例如:

如果“类型”为“成员”,则按成员姓氏排序(如果“类型”为“组”),按“组名称”排序

两者都按升序排列。

我对最终陈述的最佳猜测是:

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

我知道这是不正确的,但在其他地方找不到信息。有什么想法吗?


答案 1

好吧,您可以在MySQL中使用IF函数(请注意强调,因为还有一个不相关的IF语句)...:function

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

请注意,从 到 的整个块将被视为单个“单元”。其结果就是你试图排序的内容(因此,为什么在块之后,而不是在块内部)......CASEENDASC


答案 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;

推荐