Oracle字符字段含有数字的各种处理

[list]
  • 怎么在字符字段中查出只包含数字的数据
  • select * from table where regexp_substr(check,'[0-9]+') is not null
    
    再求和
    
    declare
     
      v_length  number default 0;  ---记录字符串长度
      t_sum    number default 0;  ---记录字符串中数字之和
      t_num    number default 0;  ---记录每次取到数字时的值
      t_is_num number default 0; ---判断取到的值是否数字
      v_str    TMP_XYX26.T2%type;  ---取出的值
     
      ---获取含有数字字符串所有记录
      cursor t_cur is
        select t2 from TMP_XYX26 where regexp_substr(t2, '[0-9]+') is not null;
     
    begin
      open t_cur;
      loop
        fetch t_cur
          into v_str;
        exit when t_cur%notfound;
        t_sum := 0;
        select length(v_str) into v_length from dual;
        for i in 1 .. v_length loop
         
          select ascii(substr(v_str, i, 1)) into t_is_num from dual; ---根据ASCII码判断取出的字符是否为数字,48到57分别 表示0-9
         
          if t_is_num between 48 and 57 then
           
            select substr(v_str, i, 1) into t_num from dual;
            t_sum := t_sum + t_num;
           
          else
            null;
          end if;
         
        end loop;
        ---打印结果
        dbms_output.put_line('字符串' || ' ' || v_str || ' ' || '对应数字之和' || t_sum);
      end loop;
      close t_cur;
    end;
    
  • 查出数字字符字段中非数字字符的记录
  • [list]
  • 方法一:translate函数
  • select translate('23456中国3-00=.,45','0123456789'||'23456中国3-00=.,45','0123456789') from dual;
    
    select trim(translate(RTRIM(LTRIM(ITEM_NUMBER)), '#0123456789', '#'))
      from TestChar
     Where trim(translate(RTRIM(LTRIM(ITEM_NUMBER)), '#0123456789', '#')) is not null;
    
  • 方法二:自定义函数
  • create or replace function f_filter_str(var_str varchar) return varchar
    is
    var_str_new varchar2(2000);
    begin
    for i in 1..length(var_str) loop
    if ascii(substr(var_str,i,1))>=48 and ascii(substr(var_str,i,1))<=57 then
    var_str_new := var_str_new || substr(var_str,i,1);
    end if;
    end loop;
    return var_str_new;
    end f_filter_str;
     
    select f_filter_str('23456中国3-00=.,45') from dual;
    
  • 方法三:正则表达式(oracle10g以上版本)
  • select regexp_replace('23456中国3-00=.,45','[^0-9]') from dual;
    

    下面是一个完整的实现方法(从数据表table的column列中查询出数字字符串并将查询出的数字字符串转换为数字型数据):
    select to_number(column) from table where REGEXP_LIKE(trim(column),'^([0-9]+/.[0-9]+)$|^[0-9]+$')  
    select to_number(column) from table where REGEXP_LIKE(trim(column),'^([0-9]+/.[0-9]+)$|^[0-9]+$') 
    

    至于非数字型字符串的方法也比较简单,因为REGEXP_LIKE返回的是一个Boolean型值,所以只需在REGEXP_LIKE前增加一个“not” 就可以了,下面查询非数字型字符串的一个完整实现(从数据表table的column列中查询出不为数字字符串的数据):
    select to_number(column) from table where not REGEXP_LIKE(trim(column),'^([0-9]+/.[0-9]+)$|^[0-9]+$')  
    
  • 方法四:Java方法
  • import Java.io.*;
    import Java.sql.*;
     
    public class StringUtil
    {
    public static String filterStr2Num(String str){
    String tmpstr = str;
    String savestr;
    String result = "";
    for (int i=0;i<tmpstr.length();i++){
    savestr = tmpstr.substring(i,i+1);
    if (StringUtil.isNumeric(savestr)){
    result+=savestr;
    }
     
    }
    return result;
     
    }
     
    public static String filterStr2Str(String str){
    String tmpstr = str;
    String savestr;
    String result = "";
    for (int i=0;i<tmpstr.length();i++){
    savestr = tmpstr.substring(i,i+1);
    if (!StringUtil.isNumeric(savestr)){
    result+=savestr;
    }
     
    }
    return result;
     
    }
     
     
    public static boolean isNumeric(String str){
    try{
    Integer.valueOf(str);
    return true;
    }catch(Exception e){
    return false;
    }
     
    } 
     
    }
    

    create or replace function Java_filterStr2Num(str In Varchar) return varchar2 as
    LANGUAGE JAVA
    NAME 'StringUtil.filterStr2Num(java.lang.String) return java.lang.String';
     
    create or replace function Java_filterStr2Str(str In Varchar) return varchar2 as
    LANGUAGE JAVA
    NAME 'StringUtil.filterStr2Str(java.lang.String) return java.lang.String';
    
    再然后
    Select java_filterStr2Num('254名字性345345别介绍') From dual; 取数字
    Select java_filterStr2Str('254名字性345345别介绍') From dual; 取文字
    
  • 方法五:正则表达式
  • 下面是一个完整的实现方法(从数据表table的column列中查询出数字字符串并将查询出的数字字符串转换为数字型数据): 
    
    select to_number(column) from table where REGEXP_LIKE(trim(column),'^([0-9]+/.[0-9]+)$|^[0-9]+$')  
    select to_number(column) from table where REGEXP_LIKE(trim(column),'^([0-9]+/.[0-9]+)$|^[0-9]+$') 
    
    至于非数字型字符串的方法也比较简单,因为REGEXP_LIKE返回的是一个Boolean型值,所以只需在REGEXP_LIKE前增加一个“not” 就可以了,下面查询非数字型字符串的一个完整实现(从数据表table的column列中查询出不为数字字符串的数据): 
    
    select to_number(column) from table where not REGEXP_LIKE(trim(column),'^([0-9]+/.[0-9]+)$|^[0-9]+$')  
    

    加了个函数来判断
    create or replace function BhToNumber(strNumber varchar2) return number
    is
    begin
           return (to_number(strNumber));
    exception
           when others then
           return (0);
    end ;
     
    sql中这样来查询 select BhToNumber(字段名) from 表名
    

    [/list]
  • 实际开发中遇到的问题
  • select a.* from ( select * from cc_activity where is_number(activity)='Y') a where 1=1
     
    select a.* from (select * from cc_activity where isnumber(activity)='Y') a where id>2060 and id<2100 and a.activity <100000;
     
    http://z-one.iteye.com/blog/1304826
    

    [/list]

    你可能感兴趣的:(oracle)