oracle,有个表列为abc(varcher2),当初想里面存入数字的,当时不小心弄错了数据类型(新手!呜呜~~~)
因为涉及到计算,现在需要把这个列abc数据类型变为 number ,可里头已经存了两个月数据,里面已经有数字、字母、null 、空格,我现在需要把是数字的数据取出来,其他的排除。这个sql语句怎么写啊?很急,求救!

解决方案 »

  1.   

    create or replace function test_is_number(p_in varchar2) return varchar2 as
        p_out varchar2(1):='N';
        i number;
    begin
        i:=to_number(p_in);
        p_out:='Y';
        return p_out;
        exception
            when others then 
                p_out:='N';
                return p_out;
    end;--判断是否是数字:是返回Y不是则返回N
    select test_is_number('2B') from dual
      

  2.   

    过程可能复杂了一些,需要自行定义一个函数用语判断是否为数字,
    然后where语言中使用该条件过滤,
      例如字定义的过程是  is_Number,只有是的时候返回一
      可以如此写
       select sum(to_number(abc)) from  table where
          is_number(abc)=1
      

  3.   

    CREATE OR REPLACE  FUNCTION TO_NUM(mynumber varchar2) return number is
    begin
      return:=to_number(mynumber);
    exception
        when others then
            return 0;
    end to_num;create table temp as select rowid id,to_num(abc) abc from tb;
    update tb set abc=null;
    alter table drop column abc;
    alter table add abc number;
    update tb set abc=(select abc from temp where temp.id=tb.rowid);
    drop table temp;
      

  4.   

    luxuezhu(卢冲):谢谢你!    我要在同表加一个字段def(number),把此条件的数据取出,然后存入此新字段,然后删除列abc(varcher2).
      

  5.   

    CREATE OR REPLACE  FUNCTION TO_NUM(mynumber varchar2) return number is
    begin
      return:=to_number(mynumber);
    exception
        when others then
            return 0;
    end to_num;alter table add def number;
    update tb set def=to_num(abc);
    update tb set abc=null;
    alter table drop column abc;
      

  6.   

    update tb set def=to_num(abc);
    update tb set abc=null;
    上面这两句可以并成
    update tb set abc=null,def=to_num(abc);
      

  7.   

    ORARichard(没钱的日子......) ,def=to_num(abc)不行啊,里面还有字母呢,转换不成数字
      

  8.   

    你没看到 to_num是下面这个函数啊,不是那个to_numberCREATE OR REPLACE  FUNCTION TO_NUM(mynumber varchar2) return number is
    begin
      return:=to_number(mynumber);
    exception
        when others then
            return 0;
    end to_num;
      

  9.   

    ORARichard(没钱的日子......) ,我做下测试先,看行不行。多谢你!
      

  10.   

    ORARichard(没钱的日子......) 的方法很不错的,呵呵
      

  11.   

    ORARichard(没钱的日子......) 的方法有缺陷。
    赫赫。假如人家本来就是0呢?嗬嗬,你这样一排除,就出问题了吧!to_number这个函数,
    1。对于NULL是不会报错的。返回NULL.
    2。对于'1E11'这样的字符串,也是不会报错的。它当成了指数。以上这些,都是不合理的地方。
      

  12.   

    Croatia(Croatia) 
    如果原来是0现在还是返回0。原来是null现在还是返回null。这是没问题的。
    不过原来是'00'这样也会返回0,这倒有点问题。至于'1e11'这样的是无法判断的,要根据你自己的情况。你可以说其是数字,你可以说它不是数字。
    如果我的表中1e11确实是个浮点数,按你的结论是不是一定要让它返回非数字呢。当然还要谢谢你的指点。确实这个函数不是通用的,还有很多要改进的地方,但放在这个问题中我觉得应该是足够了。
      

  13.   

    CREATE OR REPLACE  FUNCTION TO_NUM(mynumber varchar2) return number is
    begin
      return to_number(mynumber);
    exception
        when others then
            return 0;
    end to_num;原句中return后有点错误,前面没发现
      

  14.   

    ORARichard(没钱的日子......) : 怎么执行啊? 我在sqlplu里不知道怎么执行CREATE OR REPLACE  FUNCTION TO_NUM(mynumber varchar2) return number is
    begin
      return to_number(mynumber);
    exception
        when others then
            return 0;
    end to_num;
    小弟愚,请指教。
      

  15.   

    SQL817> CREATE OR REPLACE  FUNCTION TO_NUM(mynumber varchar2) return number is
      2  begin
      3    return to_number(mynumber);
      4  exception
      5      when others then
      6          return 0;
      7  end to_num;
      8  /函数已创建。已用时间:  00: 00: 00.11
    SQL817>