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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值