你可以在 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
列更改为更合适的列类型(例如DATE
或DATETIME
)?
@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
请注意,从CASE
到END
的整个块将被视为一个“单元”。其结果就是您要排序的内容(因此为什么 ASC
出现在块之后,而不是在块内部)...
【讨论】:
也许我误用了,但在使用建议的格式时出现错误:“SELECT * FROM table WHERE STATUS = 'Active' ORDER BY CASE TYPE WHEN 'Member' THEN LNAME ASC WHEN 'Group' THEN GROUPNAME ASC ELSE 1 END" 不,ASC
在END
之后。抱歉,我将编辑答案以使其更清楚...
我实际上采用了上面的最佳建议,因为它完全适合更少的步骤。谢谢!【参考方案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 语句吗?的主要内容,如果未能解决你的问题,请参考以下文章
在 INFORMIX 4GL 的报告中对“ORDER BY”使用“IF 语句”