nvl()之后为什么不能+1,to_number()之后为什么不能max()
SQL code
Select * FROM Product_component_version
Assembly code
1 NLSRTL 10.2.0.1.0 Production
2 Oracle Database 10g Enterprise Edition 10.2.0.1.0 64bi
3 PL/SQL 10.2.0.1.0 Production
4 TNS for IBM/AIX RISC System/6000: 10.2.0.1.0 Productio
SQL code
--mark2: 150|433199|001|ZX433199120814165311|1
--pass
select nvl(max(SUBSTR(mark2,INSTR(mark2,'|', 1, 4))),0)+1 a_num
from cpabg1.tb_pay_commi_info
--ORA-01722: invaild number
select nvl(max(SUBSTR(mark2,INSTR(mark2,'|', 1, 4))),0) a_num
from cpabg1.tb_pay_commi_info
--pass
select to_number(SUBSTR(mark2,INSTR(mark2,'|', 1, 4))) a_num
from cpabg1.tb_pay_commi_info
--ORA-01722: invaild number
select max(to_number(SUBSTR(mark2,INSTR(mark2,'|', 1, 4)))) a_num
from 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!!!