sql - Oracle sql order by with case 语句

标签 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 

我正在为此表执行以下 sql 查询以在 oracle 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 的值将不会像您期望的那样工作。

关于sql - Oracle sql order by with case 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34708058/

相关文章:

sql - VS Code 无法识别 SQL 代码中带括号的字符串

java - 最佳实践 - 根据用户选择构建查询

c# - 使用 ADO (c#) 执行 Oracle 存储过程

oracle - 如何修改oracle 12c表空间的最大大小

sql - DD-MMM-YYYY 格式的日期,例如 29-JAN-2015

sql - 将记录从一个表复制到另一个表时更改值

php - PHP如何只获取MYSQL数据库中指定时间段内的记录?

sql - BLOB 和 CLOB 的解释

oracle - 执行立即语句时无效的 ALTER TABLE 选项

sql - 在 Oracle 中使用 sql 获取过去 7 天的数据行