【问题标题】:SQL ORDER conditionally by column plus secondary columnSQL ORDER 有条件地按列加辅助列
【发布时间】:2019-10-18 15:10:17
【问题描述】:

我需要做一个涵盖一些情况的 sql 命令...

我首先需要按列到期(纪元字符串)排序,该列大于现在或为空(未到期)。

所以过期的记录(过期时间小于现在的)总是在未过期的记录之后。

然后,在每种情况下,都需要按字母顺序进行二次搜索。

t表 ID 姓名 到期 活跃

到目前为止我的尝试:

select * from `tTABLE` WHERE `active`='1' 
ORDER BY 
CASE WHEN `expiry` > 1571410101 THEN 1
CASE WHEN `expiry` = '' THEN 2 ELSE 3 END,`expiry`
DESC

【问题讨论】:

标签: mysql sql sql-order-by case-when


【解决方案1】:

我想你想要:

SELECT t.*
FROM `tTABLE` t
WHERE  active = 1  
ORDER BY (CASE WHEN expiry > unixtime() 
               THEN 1   -- explicit future expires first
               WHEN expiry IS NULL
               THEN 2   -- no expires second
               ELSE 3
          END),
         name;

【讨论】:

    【解决方案2】:

    我不确定这将如何在 MySql 中工作,但在 Oracle 中,以下 SQL 工作:

    SELECT *,
          CASE WHEN expiry > 1571410101 THEN 1
               WHEN expiry = '' THEN 2 
               ELSE 3 
          END exp
    FROM tTABLE 
    WHERE active = '1' 
    ORDER BY exp DESC
    

    我认为这同样适用于 MySql。

    【讨论】:

    • 我在 Oracle 上试过了,效果很好。事实上,我发现 MySQL 比 Oracle 更严格。我提到 Oracle 是因为我试图说明查询的结构。
    猜你喜欢
    • 2020-11-20
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    相关资源
    最近更新 更多