用select to_number(nvl(substr(HC,INSTR(HC,'#')+1,10),0)) from Tz_Xdxxb WHERE xlmc='05' and xd=201做查询,查询结果为 1然而用select xlmc,xd from Tz_Xdxxb WHERE to_number(nvl(substr(HC,INSTR(HC,'#')+1,10),0))=1做查询,查询就报“无效数字”错误何解??高分求助!

解决方案 »

  1.   

    你之前是有条件的 ,如果不加,可能substr(HC,INSTR(HC,'#')+1,10)不为空含有非数字
    加上条件呢:
    select xlmc,xd from Tz_Xdxxb WHERE to_number(nvl(substr(HC,INSTR(HC,'#')+1,10),0))=1 and xlmc='05' and xd=201;
      

  2.   

    或者你直接查询下这里面有什么数据,看看是否有非数字
    select  substr(HC,INSTR(HC,'#')+1,10) from Tz_Xdxxb 
      

  3.   

    select xlmc,xd from Tz_Xdxxb WHERE xlmc='05' and xd=201 and to_number(nvl(substr(HC,INSTR(HC,'#')+1,10),0))=1你之前的条件漏了,将一些非法数据提取出来造成错误。
      

  4.   

    --看这样是什么
    select substr(HC,INSTR(HC,'#')+1,10) from Tz_Xdxxb WHERE xlmc='05' and xd=201
      

  5.   

    substr(HC,INSTR(HC,'#')
    存在非数字的字符串
      

  6.   

    --你用这个试试
    --nvl()要求字段类型一致 你这种还是用decode比较好
    select xlmc,xd 
    from Tz_Xdxxb 
    WHERE to_number(decode(substr(HC,INSTR(HC,'#')+1,10),null,0))=1
      

  7.   

    不好意思,周末和昨天都不在公司,今天继续顶贴.to gelyon:
    substr(HC,INSTR(HC,'#')+1,10)确实是有为空的存在,所有我用了NVL把空的转为0to dawugui:
    同上to wkc168
    查询结果为1,只有1条记录 
    to zhuomingwang:
    用 decode确实不报错了,但查不出结果
      

  8.   


    --估计你的hc字段是定长的,所以导致这样的结果
    select count(nvl(substr(HC,INSTR(HC,'#')+1,10),0))  from Tz_Xdxxb WHERE xlmc='05' and xd=201
    看有多少记录--试试这样
    select xlmc,xd from Tz_Xdxxb 
    WHERE instr(trim(substr(HC,INSTR(HC,'#')+1,10)),'1')>0--or
    select xlmc,xd from Tz_Xdxxb 
    WHERE to_number(nvl(substr(trim(HC),INSTR(HC,'#')+1,10),0))=1
      

  9.   

    select xlmc,xd from Tz_Xdxxb WHERE trim(substr(HC,INSTR(HC,'#')+1,10))='1'
      

  10.   

    既然数据中存在不能转为数字的数据,就不要转为number再判断,直接trim判断string
      

  11.   


    这是不够的,nvl只能把null转为0,还在不能转为数字的字符串呢。建议改成以下代码:select xlmc,xd from Tz_Xdxxb WHERE nvl(substr(HC,INSTR(HC,'#')+1,10),'0')='1'
      

  12.   

    我又出来了,谢谢各位,首先HC这个字段呢是VARCHAR(20),其次呢我必须将其中#后的数字能够提取出来,要进行数字的比较操作,比方说select xlmc,xd from Tz_Xdxxb 
    WHERE 
    to_number(nvl(substr(HC,INSTR(HC,'#')+1,10),0))>=1
    and 
    to_number(nvl(substr(HC,INSTR(HC,'#')+1,10),0))<100
    所以呢,to_number不用不行啊
      

  13.   

    你的 SELECT nvl(substr(HC,INSTR(HC,'#')+1,10),0) from Tz_Xdxxb 查询出来的是不是除了为空的全部是数字啊???
    你得确定这点啊,如果这个查询出来的结果又非数字的且不为空,那么怎么跟数字1,100作比较啊,就会报无效数字错误!
    你先确认下。
    再把你具体需求那些说明白一点,整理一下。
      

  14.   

    我明白了,执行了
    SELECT t.hc from Tz_Xdxxb t where nvl(substr(HC,INSTR(HC,'#')+1,10),'0')<>'0'
    出来5条记录,4条符合规则,1条不符合规则,修改这条记录后,错误消失了!谢谢!