Oracle中一个千万条数据的表要检查列是否为数字
0
这个列是varchar2型的 存的是电话号码,要检查这个列里面是不是放了非数字的字符,麻烦大神帮忙写一个sql能查出来,最好查询速度快点的
没有找到相关结果
重要提示:提问者不能发表回复,可以通过评论与回答者沟通,沟通后可以通过编辑功能完善问题描述,以便后续其他人能够更容易理解问题.
1 个回复
老头子 - 专注是唯一的捷径 2015-10-22 回答
赞同来自: niuggts 、BAO胖子
要么直接写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