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を降順で並べ替えているので、「トレーニング」は「人事」より上にあるべきだと思いました。
私の理解はどこで間違っていますか?誰かがこれを詳しく説明してもらえますか?
部門名を降順で表示する場合は、その情報をクエリに含める必要があります。
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より大きい値は期待どおりに機能しません。
デコード機能でこれを試してください、基本的に同じことをします。
SELECT DEPT_NO, DEPT_NAME
FROM SORTNG_LOGIC
ORDER BY
decode (DEPT_NAME,'ACCOUNT','1','AUDIT','2','FINANCE','3','4') DESC;