分区排序子句中多CASE语句语法错误排查求助
修正你的ROW_NUMBER()多CASE排序语法问题
我帮你梳理出了原SQL里的几个语法错误,调整后就能完整保留你想要的CASE逻辑,先看修正后的代码:
SELECT name, ROW_NUMBER() OVER( PARTITION BY lastname, rollno ORDER BY -- 处理gender/address为空时用effdate,否则按postoffc和file.effdate的关系取值 CASE WHEN NVL(gender, address) IS NULL THEN a.effdate ELSE CASE WHEN NVL(a.postoffc, a.mon) <= file.effdate THEN file.effdate ELSE a.postoffc END END DESC, -- 第二个排序维度:用covcode或pass的值 NVL(l4.covcode, a.pass) ) rn FROM customers a;
关键修正点说明:
- 拼写错误修正:把
PARTITON改成了正确的PARTITION,这是最基础的语法疏漏 - 排序方向位置调整:原代码把
DESC写在了CASE表达式内部,这是错误的——CASE的作用是生成排序用的字段值,排序方向(ASC/DESC)应该放在整个CASE表达式的后面,作用于这个表达式返回的结果 - 嵌套CASE语法规范:原代码的嵌套CASE括号不匹配,导致逻辑结构混乱,现在调整后每个CASE都有对应的END,层级清晰
- 排序条件分隔:明确用逗号分隔两个排序条件,让ORDER BY的逻辑一目了然
这样调整后,你的CASE逻辑完全保留,语法也符合SQL标准,应该就能正常执行了。
内容的提问来源于stack exchange,提问作者Random guy
相关产品推荐
相关产品推荐

