Oracle中一个千万条数据的表要检查列是否为数字

0
这个列是varchar2型的 存的是电话号码,要检查这个列里面是不是放了非数字的字符,麻烦大神帮忙写一个sql能查出来,最好查询速度快点的
已邀请:
2

老头子 - 专注是唯一的捷径 2015-10-22 回答

要么写个函数判断,在SQL中调用函数
要么直接写SQL处理,但都要对该字段进行计算,看你想要哪种?

最好的方式是写函数进行判断处理,
函数中直接to_number(字段) 如果抛异常就返回0  如果不抛异常则返回1(具体返回值可以自己根据需求设定)
这种方式相比正则表达式判断的好处是避免oracle把11.22.11这种判断成数字,在Oracle中10E2也是数字,所以写函数to_number是最保险的。
如下可以参考:

CREATE OR REPLACE FUNCTION isnumeric(str IN VARCHAR2)
    RETURN NUMBER
IS
    v_str FLOAT;
BEGIN
    IF str IS NULL
    THEN
       RETURN 0;
    ELSE
       BEGIN
          SELECT TO_NUMBER (str)
            INTO v_str
            FROM DUAL;
       EXCEPTION
          WHEN INVALID_NUMBER
          THEN
             RETURN 0;
       END;
       RETURN 1;
    END IF;
END isnumeric;
------------分割线----------------
with ltz as
(
select '123123800d89709' a from dual union all
select '123122709' a from dual union all
select '10E3' a from dual union all
select '11.22' a from dual union all
select '11.22.33.44' a from dual union all
select 'aadfsadf' a from dual union all
select '-10' a from dual union all
select '' a from dual union all
select '+10' a from dual 
)
select isnumeric(t.a),t.*  from ltz t
 

111.png

 

要回复问题请先登录注册