日期:2014-05-17  浏览次数:21094 次

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!!!