现在要加一个条件to_number(某表的attribute1列)=某表的ID列问题是某表的attribute1列有一些不全是纯数字的于是就报错,而纯数字的数据才是我要的数据
怎么办.........
改成某表的attribute1=to_char(某表的ID列)?不行啊.....
某表的ID列是索引列,破坏了索引就慢到根本出不来结果我想问有没有一个强制转字符串到数字的函数呢....
或者怎么去先判断一个字符串能否转数字,然后decode

解决方案 »

  1.   

    需要自己写函数,将字符串遍历下,凡有ASCII码不在48-57间的就抛异常。
      

  2.   

    使用以下自定义函数,返回1的是数值,0则不是。
    create or replace function is_numeric(p_char in varchar2)       
        return number
        as
        v_number number;
        begin
         v_number:=to_number(p_char);
        return 1;           --正确
        exception
        when others then
        return 0;
    end;
      

  3.   

    2楼:定义后这样?
    select ...
    form...
    where....
    and 
    to_number(decode(is_numeric(某表的attribute1列),1,to_number(某表的attribute1列),0 )=某表的ID列1楼可以说说怎么逐个拿出字符串的每个再怎么看它ASC值就好了
      

  4.   

    不错,只需要把is_numeric当做一个函数来用就可以了。
    历遍整个字符串也不是不可以,只是需要判断的情况太多,代码会写得很长,而且效率肯定是比不上用oracle的内置函数的。
      

  5.   

    代码不是很长,效率很低倒是一定的。while  v_counter <= length(p_string) do    set v_char = substr(p_string, v_counter, 1);    if ascii(v_char) < 48 or ascii(v_char) > 57 then
            return 0;
        end if;        
        set v_counter = v_counter + 1;end while; -- while  v_counter <= length(p_string) do这是DB2的写法,ORACLE也差不多的,你可以参考下。上不上是个态度问题,上不上的了是个能力问题
      

  6.   

    比较好的办法就是建立“函数索引”,这样,你用to_char(某表的ID列)的时候照样可以用上索引:
    create  index idx_xxx on t(to_char(某表的ID列));
      

  7.   

    如果是oracle10g就方便了,可以这样返回字符串是否全是数字的行SELECT * FROM tabname WHERE regexp_like(colname,'^[[:digit:]]+$');
      

  8.   


    这个方法不错,写一个function,不过不知道用exption来进行处理是不是一个好方法哟,这里推荐另一个做法,就是用translate来做如下
    SQL> with temp as
      2  (select 'qweqw1231' num from dual
      3  union
      4  select '123' num from dual)
      5  select num from temp where length(translate(upper(num), '0123456789ABCDEFGH
    IJKLMNOPQRSTUVWXYZ','0123456789'))=length(num);NUM
    ---------
    123
      

  9.   

    如果该字段都是数字加字母的形式,而没有特殊字符的话。到可以通过
    ......
    attribute1=upper(attribute1)
    and attribute1=lower(attribute1)
    条件进行过滤
      

  10.   

    11楼的方法也不错,可以用转义试试
    to_number(decode(is_numeric(某表的attribute1列),1,to_number(某表的attribute1列),0 )=某表的ID列
    -->
    to_number(decode(translate(upper(某表的attribute1列),'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ., !@#$%^&*()''"<>?','0123456789'),某表的attribute1列,某表的attribute1列))=某表的ID列