我有一个数据表tab1,大概100万条记录。里面有一个字段(field1)是varchar2类型的,但是其实里面存储的是数字格式的字符。
我执行“select * from tab1 where to_number(field1)>=100000”的时候经常会报“数据不是合法数字类型”的错误。
但是我不知道具体出错的记录是哪个。
oracle里面有没有哪个函数可以对字符是否能够转换为数字(或者日期)进行判断呢?

解决方案 »

  1.   

    select *
      from tab1
     where translate(field1, '\\0123456789', '\\') is not null;
    --10g以上还可以使用正则表达式函数
      

  2.   

    写个小函数就行了
    create or replace function isNumber(p_value in varchar2)
      return pls_integer is
      v_to number;begin
      begin
        v_to := to_number(p_value);
        return(1);  -----如果是返回1  exception
        when others then
          return(2);------如果不是返回2
      end;end number_varchar;select isNumber(field1) from table
      

  3.   

    兄弟,函数不能这样用。。
    应该放在SELECT中用。。
    SELECT to_number(p_value) INTO v_to  FROM DUAL
      

  4.   


    select * from tab1 where f_number(field1)=0---1为数字 0不为数字 
    SQL> edi
    已写入 file afiedt.buf  1  create or replace function f_number(p_num varchar2) return number
      2  as
      3  num number;
      4  begin
      5  if p_num is null then
      6  return null;
      7  end if;
      8  num:=to_number(p_num);
      9  return 1;
     10  exception
     11  when others then
     12  return 0;
     13* end;
    SQL> /函数已创建。SQL> select f_number('122') from dual
      2  /F_NUMBER('122')
    ---------------
                  1SQL> select f_number('12  22') from dual
      2  /F_NUMBER('1222')
    ----------------
                   0SQL> select f_number(null) from dual
      2  /F_NUMBER(NULL)
    --------------
      

  5.   

    不知道楼主你所说的字段(field1)是varchar2类型,存储的是数字,是否是全部都是数字的字符???从你描述来看 ,你的SQL语句不会有问题的,但是出现了“数据不是合法数字类型”只能说明你字段field1中有写数据不是数字,你可能要再确定下!
    另外,如果字段(field1)是数字字符的话,你SQL语句中where后没必要进行to_number()转换,Oracle在执行查询的时候会隐式转换类型的,也就是直接select * from tab1 where field1>=100000就可以了
      

  6.   

    回九楼,我的问题就是说那个字段是varchar2(40),但是里面存储的数据大部分是数字形式的字符串,比如说“234.88”,但是有个别信息又不不能被合法翻译成字符串,例如"188,244.00"(里面多了个逗号,还有很多不知道的情况导致字符串不能被正确翻译成数字),因此我执行to_number的时候经常出错。
    我现在需要一个函数,能够判断字符串内容是不是合法的数字形式,该如何判断。