带有case语句

时间:2016-01-10 16:44:48

标签: sql oracle oracle-sqldeveloper

我在使用case语句理解oracle(12c)sql order by子句时遇到了困难。 我有一张包含以下数据的表格,

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时,我认为'Training'应该高于'人力资源'。

我的理解在哪里出错了?有人可以详细解释一下吗?

2 个答案:

答案 0 :(得分:3)

如果您希望部门名称按降序排列,则必须在查询中包含该信息:

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的值将无法按预期工作。

答案 1 :(得分:1)

尝试使用解码功能,基本上做同样的事情。

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