SQL 按列加辅助列有条件地排序
SQL ORDER conditionally by column plus secondary column
我需要做一个 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 中如何工作,但在 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。
我想你想要:
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;
我需要做一个 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 中如何工作,但在 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。
我想你想要:
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;