日期:2014-05-17  浏览次数:20722 次

关于判断 一个字段值 不是数字的
现在有一个字段A是char(5) 类型的 。表里面有好多错误数据

正确的 是在10001 到 10008之间的  我现在在存储过程 想把 不是这个范围的找出来 。
这里面的值不只都是 10001、这种格式。还有空的 还有带字母的。。我就是想把 空的 带字母的和不再以上范围的找出来 。。我写了判断跑到半截就报错。


怎么写 
存储

------解决方案--------------------
这种需求 不用正则 多可惜啊。。。

select *
  from t
 where not regexp_like(t.a, '+[^[:digit:]$]+')
   and length(t.a) = 5;

------解决方案--------------------
这种问题讨论了很多了哈、方法大概会有三种
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 isnum