使用 Case 语句的具有多列的 Order By 子句

Posted

技术标签:

【中文标题】使用 Case 语句的具有多列的 Order By 子句【英文标题】:Order By clause with multiple columns using Case statement 【发布时间】:2021-12-13 01:06:29 【问题描述】:

在下面的查询中,我需要对 sortest_tesc_code 排序顺序进行硬编码,如 order by case 语句所示。这可行,但我还需要第二次排序,以便多个sortest_tesc_code 值将按其sortest_test_date 降序排序。如何添加第二个排序?

SELECT  stvtesc_desc testname,
    nvl(sortest_test_score, '-') testscore,
    nvl(sortest_tesc_code, ' ') placement,
    nvl(SORTEST_TSRC_CODE, ' ') method_cocc,
    nvl(TO_CHAR(sortest_test_date,'DD-MON-YYYY'),' - ') testdate
FROM stvtesc, sortest_add
WHERE (stvtesc_vr_msg_no <> '999' or stvtesc_vr_msg_no is null)
AND   sortest_tesc_code not in ('CASM','CASR','CASW')
AND   sortest_tesc_code = stvtesc_code
AND   sortest_pidm      = testpidm             
ORDER BY
      case 
         when sortest_tesc_code = 'PLM' then 1 
         when sortest_tesc_code = 'PLW' then 2
         when sortest_tesc_code = 'MEX' then 3
         when sortest_tesc_code = 'WEX' then 4
         when sortest_tesc_code = 'BWC' then 5
         when sortest_tesc_code = 'BWX' then 6
         when sortest_tesc_code = 'OOC' then 7
         when sortest_tesc_code = 'HSRT' then 8
         when sortest_tesc_code like 'TE%' then 9
         when sortest_tesc_code = 'COMP' then 10
      end; 

sortest_test_date 的查询结果未按 sortest_tesc_code PLM 的要求排序:

Placement Level Math    015 PLM DSP     14-APR-2018
Placement Level Math    018 PLM ALKS    20-MAY-2020
Placement Level Math    010 PLM DSP     15-MAY-2019
Placement Level Writing 009 PLW DSP     20-MAY-2019

【问题讨论】:

【参考方案1】:

那是因为您没有指示 Oracle 这样做。您仅按sortest_tesc_code 排序,而缺少sortest_test_date,即

ORDER BY
  case 
     when sortest_tesc_code = 'PLM' then 1 
     when sortest_tesc_code = 'PLW' then 2
     when sortest_tesc_code = 'MEX' then 3
     when sortest_tesc_code = 'WEX' then 4
     when sortest_tesc_code = 'BWC' then 5
     when sortest_tesc_code = 'BWX' then 6
     when sortest_tesc_code = 'OOC' then 7
     when sortest_tesc_code = 'HSRT' then 8
     when sortest_tesc_code like 'TE%' then 9
     when sortest_tesc_code = 'COMP' then 10
  end,
  sortest_test_date                            --> this
;

【讨论】:

以上是关于使用 Case 语句的具有多列的 Order By 子句的主要内容,如果未能解决你的问题,请参考以下文章

在 ORDER BY 中使用 CASE 语句

ORDER BY 子句的 CASE WHEN 语句

mysql - ORDER BY 语句中的 IF...ELSE 或 CASE

ORDER BY 中带有 CASE WHEN 的 SQL 语句导致类型转换错误

在 MySQL 中使用 Case 加入 Group By & Order

PostgreSQL ORDER BY 语句