执行多个case条件并给出错误

问题描述 投票:0回答:1

我正在使用以下查询

SELECT d.mon,
CASE
WHEN MAX(CASE WHEN d.DRR = '80+' THEN 9999 ELSE TO_NUMBER(substr(d.DRR,1,INSTR(d.DRR, '-') - 1)) END) = 9999 THEN '80+'
WHEN MAX(CASE WHEN d.DRR = 'CURR' THEN 0 ELSE TO_NUMBER(substr(d.DRR,1,INSTR(d.DRR, '-') - 1)) END) = 0 THEN 'CURR'
ELSE(
 TO_CHAR(max(TO_NUMBER(substr(d.DRR,1,INSTR(d.DRR, '-') - 1)))) || '-' ||
 TO_CHAR(MAX( TO_NUMBER(substr(d.DRR,INSTR(d.DRR, '-') +1)) ))))
END
AS bill
FROM table d
GROUP BY d.mon
ORDER BY d.mon

但它给了我无效的数字。我有以下数据集:

减灾
1 80+
1 1-30

它应该导致:

减灾
1 80+

在我添加以下条件之前它不起作用:

  TO_CHAR(MAX(CASE WHEN d.DRR = 'CURR' THEN 0 WHEN d.DRR = '80+' THEN 1 ELSE TO_NUMBER(substr(d.DRR,INSTR(d.DRR, '-') +1)) END))

为什么我需要在满足第一个条件的情况下添加这个条件。

oracle case
1个回答
0
投票

当然,您遇到了“号码无效”错误。那是因为您尝试将 to_number 函数应用于此

substr
:
 的结果
SQL> WITH 2 table1 (mon, drr) 3 AS 4 (SELECT 1, '80+' FROM DUAL 5 UNION ALL 6 SELECT 1, '1-30' FROM DUAL) 7 SELECT SUBSTR (d.DRR, INSTR (d.DRR, '-') + 1) --> this 8 FROM table1 d; SUBS ---- 80+ --> this is where TO_NUMBER fails 30 SQL>

该查询应该做什么?条件看起来有点
复杂

。您需要使用max功能吗?如果是这样,为什么?您正在比较两个值,所以也许您只需要使用

greatest
?您能用简单的英语解释一下您想要解决什么问题吗?必须对
source
数据应用哪些规则才能获取 target 数据?也许您的查询可以(显着?)简化。

© www.soinside.com 2019 - 2024. All rights reserved.