2

以下代码生成一个列表,其中未过期的行在顶部,然后是过期日期未知的行,最后是已经过期的行(所有行都按升序排列)。问题是我希望已过期行的最后一个块按降序排列,因此它会在该块顶部显示最近过期的行,而不会改变其他顶部块的顺序。

基本上,我试图找到一种方法在同一个记录集中合并两个“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
4

2 回答 2

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
于 2012-12-15T04:13:21.657 回答
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)
于 2012-12-15T03:55:12.033 回答