当前位置: 代码迷 >> Oracle开发 >> nvl()以后为什么不能+1,to_number()之后为什么不能max()
  详细解决方案

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

热度:81   发布时间:2016-04-24 07:23:20.0
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!!!