web-dev-qa-db-ja.com

Oracle sql order by withcaseステートメント

Oracle(12c)のSQLのorderby句とcaseステートメントを理解するのが難しい。以下のデータを含む表があります。

SELECT DEPT_NO, DEPT_NAME FROM SORTNG_LOGIC;

DEPT_NO DEPT_NAME          
---------- --------------------
     1 FINANCE             
     2 ACCOUNT             
     3 HUMAN RESOURCE      
     4 AUDIT               
     5 TRAINING 

Oracle SQL Developerで、カスタムオーダーを追加するために、このテーブルに対して以下のSQLクエリを実行しています。

SELECT DEPT_NO, DEPT_NAME FROM SORTNG_LOGIC ORDER BY (
CASE DEPT_NAME
WHEN 'ACCOUNT' THEN '1'
WHEN 'AUDIT' THEN '2'
WHEN 'FINANCE' THEN '3'
ELSE '4' END
)DESC;

これにより、以下の結果が得られます。

DEPT_NO DEPT_NAME          
---------- --------------------
     3 HUMAN RESOURCE      
     5 TRAINING            
     1 FINANCE             
     4 AUDIT               
     2 ACCOUNT   

しかし、私はそれを期待しました、結果は

DEPT_NO DEPT_NAME          
---------- --------------------
     5 TRAINING            
     3 HUMAN RESOURCE      
     1 FINANCE             
     4 AUDIT               
     2 ACCOUNT   

Dept_nameを降順で並べ替えているので、「トレーニング」は「人事」より上にあるべきだと思いました。

私の理解はどこで間違っていますか?誰かがこれを詳しく説明してもらえますか?

5
Johnyzhub

部門名を降順で表示する場合は、その情報をクエリに含める必要があります。

ORDER BY (CASE DEPT_NAME
              WHEN 'ACCOUNT' THEN 1
              WHEN 'AUDIT' THEN 2
              WHEN 'FINANCE' THEN 3
              ELSE 4
          END) DESC,
         DEPT_NAME DESC;

CASEの値が文字列である理由はありません。ロジックは実際には数値を必要とします。文字列を使用する場合、9より大きい値は期待どおりに機能しません。

4
Gordon Linoff

デコード機能でこれを試してください、基本的に同じことをします。

SELECT DEPT_NO, DEPT_NAME 
  FROM SORTNG_LOGIC 
 ORDER BY 
decode (DEPT_NAME,'ACCOUNT','1','AUDIT','2','FINANCE','3','4') DESC;
1
Techie