以下代码生成一个列表,其顶部是非过期行,然后是未知到期日期的列表,最后是已过期的列表(所有这些行都按升序排列)。问题是我希望已经过期的行的最后一个块按降序排列,这样它就会显示最近在该块顶部过期的行,而不会改变其他顶部块的顺序。
基本上,我试图找到一种方法在同一记录集中包含两个“ORDER BY”子句......
有什么想法吗?感谢
SELECT *
FROM prueba
WHERE UPPER(CONCAT(Company,Deal,keywords,Type,Expiry,Name)) LIKE UPPER(%s)
ORDER BY (CASE
WHEN prueba.Expiry = 'UNKNOWN' THEN 1
WHEN prueba.Expiry < CURRENT_DATE THEN 2
END)
, prueba.Expiry ASC
答案 0 :(得分:1)
试试这个
SELECT * FROM t
order by case
when expiry = 'Unknown' Then 1
WHEN expiry >= CURRENT_DATE THEN 0
ELSE 2 END,
CASE WHEN expiry >= CURRENT_DATE THEN expiry END,
CASE WHEN expiry < CURRENT_DATE THEN expiry END desc
答案 1 :(得分:0)
将已过期的记录分隔为另一个SELECT
子句,然后UNION ALL
:
(SELECT *
FROM prueba
WHERE UPPER(CONCAT(Company,Deal,keywords,Type,Expiry,Name)) LIKE UPPER(%s)
AND prueba.Expiry > CURRENT_DATE
ORDER BY prueba.Expiry DESC)
UNION ALL
(SELECT *
FROM prueba
WHERE UPPER(CONCAT(Company,Deal,keywords,Type,Expiry,Name)) LIKE UPPER(%s)
AND prueba.Expiry = 'UNKNOWN')
UNION ALL
(SELECT *
FROM prueba
WHERE UPPER(CONCAT(Company,Deal,keywords,Type,Expiry,Name)) LIKE UPPER(%s)
AND prueba.Expiry < CURRENT_DATE
ORDER BY prueba.Expiry DESC)