2

次のコードは、有効期限が切れていない行を一番上に、次に有効期限が不明な行を、最後に既に有効期限が切れている行を含むリストを作成しています (すべて昇順)。問題は、既に期限切れの行の最後のブロックを降順にしたいので、他のトップブロックの順序を変更せずに、最近期限切れになった行をそのブロックの上に表示することです。

基本的に、同じレコードセット内に 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 に答える