现在有一个字段A是char(5) 类型的 。表里面有好多错误数据正确的 是在10001 到 10008之间的 我现在在存储过程 想把 不是这个范围的找出来 。
这里面的值不只都是 10001、这种格式。还有空的 还有带字母的。。我就是想把 空的 带字母的和不再以上范围的找出来 。。我写了判断跑到半截就报错。
怎么写 存储
这里面的值不只都是 10001、这种格式。还有空的 还有带字母的。。我就是想把 空的 带字母的和不再以上范围的找出来 。。我写了判断跑到半截就报错。
怎么写 存储
from t
where not regexp_like(t.a, '+[^[:digit:]$]+')
and length(t.a) = 5;
select *
from t
where not regexp_like(t.a, '+[^[:digit:]$]+')
and length(t.a) = 5
and t.a between '10001' and '10008';
to_number <==通用型
transalte <==好像是最简单的
还有就是10g的正则表达式 <==会有版本问题我拿to_number实现一个sys@ORCL> ed
Wrote file afiedt.buf 1 CREATE OR REPLACE FUNCTION isnumeric (str IN VARCHAR2)
2 RETURN NUMBER
3 IS
4 v_str FLOAT;
5 BEGIN
6 IF str IS NULL
7 THEN
8 RETURN 0;
9 ELSE
10 BEGIN
11 SELECT TO_NUMBER (str)
12 INTO v_str
13 FROM DUAL;
14 EXCEPTION
15 WHEN INVALID_NUMBER
16 THEN
17 RETURN 0;
18 END;
19 RETURN 1;
20 END IF;
21* END isnumeric;
sys@ORCL> /
sys@ORCL> insert into t values('abc');1 row created.sys@ORCL> insert into t values('123');1 row created.sys@ORCL> insert into t values('cde');1 row created.sys@ORCL> insert into t values('456122');1 row created.sys@ORCL> insert into t values('efd4554');1 row created.
sys@ORCL> insert into t values (NULL);1 row created.sys@ORCL> commit;Commit complete.
sys@ORCL> select * from t where isnumeric(a) != 1;A
----------
abc
cde
efd4554
sys@ORCL> select * from t where translate(a,'x0123456789','x') is null;A
----------
123
456122
你定义的这个变量是什么类型的?数据库这个字段是char(5)
我定义的 对应的 是number 的
你定义的这个变量是什么类型的?数据库这个字段是char(5)
我定义的 对应的 是number 的
.....一个sql能搞定的事,还用游标 逐条处理干嘛。3# 的函数 里面也有出错的处理思路。你看下修改你的代码即可。