使用 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 子句的主要内容,如果未能解决你的问题,请参考以下文章
mysql - ORDER BY 语句中的 IF...ELSE 或 CASE
ORDER BY 中带有 CASE WHEN 的 SQL 语句导致类型转换错误