通过同事和好朋友查找,现将实现的方法给大家,a.oracle 自有函数实现 b.自定义函数实现
注意两种方法中字段都不能为null,这种情况要用case when 进行处理后方可用。
1.translate 方法,此方法是一个同事提供的特别好。
create table tux_if_number
(
serv_id number(20),
acc_nbr varchar2(30)
);
insert into tux_if_number values (1,'15204669284');
insert into tux_if_number values (2,'n045144669284');
insert into tux_if_number values (3,null);
select * from tux_if_number;
select
t.serv_id,
case when t.acc_nbr is null then -1
when translate(t.acc_nbr,'#0123456789','#') is null then 1
when translate(t.acc_nbr,'#0123456789','#') is not null then -1
end
from tux_if_number t;
把translate 相关用法给大家:
一、语法:
TRANSLATE(string,from_str,to_str)
二、目的
返回将(所有出现的)from_str中的每个字符替换为to_str中的相应字符以后的string。TRANSLATE 是 REPLACE 所提供的功能的一个超集。如果 from_str 比 to_str 长,那么在 from_str 中而不在 to_str 中的额外字符将从 string 中被删除,因为它们没有相应的替换字符。to_str 不能为空。Oracle 将空字符串解释为 NULL,并且如果TRANSLATE 中的任何参数为NULL,那么结果也是 NULL。
三、允许使用的位置
过程性语句和SQL语句。
示例如下:
select translate('abcdefghij','abcdefghij','123456') from dual;
select translate('abcdefghij','abcdefghij','123456i') from dual;
2.自定义方法实,虽然能实现,但没有自带的方便,没有创建函数的情况下就不适用了,在这里只是要了解一下0-9的ascii为48-57即可.以下函数参考.
create or replace function if_number(in_varchar in varchar2)
return integer as flag integer;
i integer;
begin
for i in 1..length(in_varchar)
loop
if ascii(substr(in_varchar,i,1))>=48 and ascii(substr(in_varchar,i,1))<=57
then
flag:=1;
else
flag:=-1;
exit;
end if;
end loop;
return flag;
end if_number;
-- 实现和自有函数相关的sql如下:
select
t.serv_id,
case when t.acc_nbr is null then -1 else if_number(t.acc_nbr) end
from tux_if_number t;
以上仅为在开发中遇到同样的问题提供一个方法及参考,有更好的欢迎来交流
QQ:360263676