你可以在 ORDER BY 中添加 if 语句吗?

Posted

技术标签:

【中文标题】你可以在 ORDER BY 中添加 if 语句吗?【英文标题】:Can you add an if statement in ORDER BY? 【发布时间】:2011-04-02 19:56:52 【问题描述】:

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

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

例如:

如果类型是成员,则按成员姓氏排序 如果类型是组,则按组名排序

都按升序排列。

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

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

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

【问题讨论】:

那么您的查询是否有可能同时返回这两种类型?如果不是,您不会说每种类型有两个不同的查询,那么很容易为每个类型创建一个 order by 子句。 @iznogood - 如果提前知道类型或排序(考虑按名称字母排序),我们会这样做,但这在这种特殊情况下似乎不起作用。例如: $query = "SELECT * FROM table WHERE STATUS = 'Active' AND ((LNAME LIKE 'A%' AND PARTY = 'Member') OR (GROUPNAME LIKE 'A%' AND PARTY = 'Group')) ORDER通过 KDATE ASC";确实有效 @JM4:您是否已将KDATE 列更改为更合适的列类型(例如DATEDATETIME)? @ircmaxell - 我在一些新表上做了,并且正在将旧表迁移到新格式。主要问题是监控“实时”站点和数据库,并找出修改 php 脚本以及数据库结构的最佳方法,而不会弄乱每天需要 400 次注册的站点。 @JM4:进步是最重要的。罗马不是一天建成的。我很高兴听到至少事情正在朝着更好的方向发展...... 【参考方案1】:

嗯,你可以在 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

请注意,从CASEEND 的整个块将被视为一个“单元”。其结果就是您要排序的内容(因此为什么 ASC 出现在块之后,而不是在块内部)...

【讨论】:

也许我误用了,但在使用建议的格式时出现错误:“SELECT * FROM table WHERE STATUS = 'Active' ORDER BY CASE TYPE WHEN 'Member' THEN LNAME ASC WHEN 'Group' THEN GROUPNAME ASC ELSE 1 END" 不,ASCEND 之后。抱歉,我将编辑答案以使其更清楚... 我实际上采用了上面的最佳建议,因为它完全适合更少的步骤。谢谢!【参考方案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;

【讨论】:

当然,"_orderby" 是参数的名称...抱歉,如果从示例中不清楚。 这种方法对我来说效果最好,因为它可以灵活地让您单独设置 ASC / DESC,而不是为整个组设置。 很高兴我能帮上忙!这也是我这样做的原因。

以上是关于你可以在 ORDER BY 中添加 if 语句吗?的主要内容,如果未能解决你的问题,请参考以下文章

你真的懂mysql中order by吗

你真的懂mysql中order by吗

在数据库查询中order by 后面可以给表达式吗?

在 INFORMIX 4GL 的报告中对“ORDER BY”使用“IF 语句”

我可以在 SQL 中使用 UNION 子句的查询中添加 ORDER BY 子句吗?

order by 后有多个字段