本人的SQL命令如下:  
select * from table_name r
 where r.NVCSTATE < 6           --nvcstate,状态,varchar2(6)
    and r.id = 2437             --id,编号,number
查询时提示ORA-01722:无效数字
如果条件加上分号 r.NVCSTATE < ‘6’ ,则查询成功!!谢谢!

解决方案 »

  1.   

    -- 因为 NVCSTATE 字段是字符类型,
    -- 当用 where r.NVCSTATE < 6 这样的条件的时候,
    -- 会发生隐式类型转换(先将NVCSTATE转换成数值类型,再与数值6比较),
    -- 所以:当NVCSTATE字段存在不能转换成数值类型的值时(例如:字符值'A5'就不能转换成数值),
    -- 此时就会报错!-- 而当用 where r.NVCSTATE < '6' 时,两边都是字符类型,不会产生隐式类型转换,所以不报错!-- 提示:写SQL语句,尽量避免隐式类型转换!
    -- 即此处最好的写法:where r.NVCSTATE < '6' 
      

  2.   


    -- 记住一句话:如果字段为字符类型,则where 条件中比较值引号(例如:'6')
    --            如果字段为数值类型,则where 条件中比较值不打引号(例如:6);
      

  3.   


    --如果nvcstate里面存的是数字的话,还是用number比较好--如果不仅是数字 还包含字符的话 
    --你要和数字6进行比较肯定会报错的  
    --但是如果是nvcstate<'6'的话是跟字符6进行ascii码比较了 
      

  4.   

    但是如果是nvcstate<'6'的话是跟字符6进行ascii码比较了
    这个,能不能麻烦您解释一下?进行ascii码比较,会不会有问题?
    谢谢!
      

  5.   


    你说的问题是指什么?大家都是用ASCII码来进行比较的。并且是从第一个字符开始比较的,比如 有两条记录,一条是  16,一条是  6(都是字符型),从数字来说16是大于6的,但字符来比较的话会从每个的第一个字符来比较的也就是用6来和1比,6的ASCII码比1的大,所以‘16’满足上面的nvstate < '6'的条件。