nvl()以后为什么不能+1,to_number()之后为什么不能max()

nvl()之后为什么不能+1,to_number()之后为什么不能max()SQL codeSelect * FROM Product_component_version

nvl()之后为什么不能+1,to_number()之后为什么不能max()

SQL code
Select * FROM Product_component_version  

Assembly code
1    NLSRTL     10.2.0.1.0    Production2    Oracle Database 10g Enterprise Edition     10.2.0.1.0    64bi3    PL/SQL     10.2.0.1.0    Production4    TNS for IBM/AIX RISC System/6000:     10.2.0.1.0    Productio

SQL code
--mark2: 150|433199|001|ZX433199120814165311|1 --passselect nvl(max(SUBSTR(mark2,INSTR(mark2,'|', 1, 4))),0)+1 a_numfrom cpabg1.tb_pay_commi_info--ORA-01722: invaild numberselect nvl(max(SUBSTR(mark2,INSTR(mark2,'|', 1, 4))),0) a_numfrom cpabg1.tb_pay_commi_info--passselect to_number(SUBSTR(mark2,INSTR(mark2,'|', 1, 4))) a_numfrom cpabg1.tb_pay_commi_info--ORA-01722: invaild numberselect max(to_number(SUBSTR(mark2,INSTR(mark2,'|', 1, 4)))) a_numfrom cpabg1.tb_pay_commi_info


who can tell me ,why?[


[解决办法]
select nvl(max(SUBSTR(mark2,INSTR(mark2,'|', 1, 4))),0)
返回的是 |1,所以不能+1

同理,
SUBSTR(mark2,INSTR(mark2,'|', 1, 4))返回的是 |1,所以不能to_number().
[解决办法]
猜测你想要的结果是:改成SUBSTR(mark2,INSTR(mark2,'|', 1, 4)+1[b][/b])
[解决办法]
猜测你想要的结果是:改成SUBSTR(mark2,INSTR(mark2,'|', 1, 4)+1)
[解决办法]
如果为空可以加,但不是空返回字符串,当然不能加。。。
[解决办法]
刚测了下 你的 SUBSTR(mark2,INSTR(mark2,'|', 1, 4)) 返回的是一个字符 ‘|1’不是数字 。你自己看清楚啊。
[解决办法]
按照你的例子

SELECT NVL(MAX(SUBSTR('150|433199|001|ZX433199120814165311|1', INSTR('150|433199|001|ZX433199120814165311|1', '|', 1, 4))), 0) FROM dual
的值是‘|1’,自然是不能+1.
同理,‘|1’也不能to_number!!!