Oracle中如何判断字符串是否全为数字
Posted stono
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle中如何判断字符串是否全为数字相关的知识,希望对你有一定的参考价值。
Oracle中如何判断字符串是否全为数字
学习了:http://www.cnblogs.com/zrcoffee/archive/2012/12/11/2812744.html
本文介绍了判断字符串是否全为数字的4种办法,另外还介绍了一个translate函数的小技巧,从任意字符串中提取数字(调用2次translate函数)。这个办法是一个公司同事发现的,用起来很方便,但理解起来稍有点困难。
1、通过ASCII码判断是否数字,介于[48, 57]之间,(ascii(\'0\') = 48, ascii(\'9\') = \'57\')
2、调用cast函数尝试强制转换成NUMERIC或NUMBER,不是合法数字串即抛异常
3、调用translate函数,剔除所有[0-9]数字后,看是否为空串
4、调用正则表达式,进行模式匹配(10g版本新加入的功能)
--通过ASCII码判断是否数字,介于[48, 57]之间,(ascii(\'0\') = 48, ascii(\'9\') = \'57\') DECLARE str VARCHAR2(10) := \'123a\'; val NUMERIC(10); i int; k int; flag BOOLEAN; BEGIN flag := TRUE; for i in 1..10 loop --新密码是否6位数字 k := ascii(substr(str, i, 1)); if k < 48 or k > 57 THEN flag := FALSE; end if; end LOOP; IF flag = true THEN dbms_output.put_line(str || \'是[0-9]的数字序列\'); ELSE dbms_output.put_line(str || \'不是[0-9]的数字序列\'); END IF; END; -- 调用cast函数尝试强制转换成NUMERIC或NUMBER,不是合法数字串即抛异常 DECLARE str VARCHAR2(10) := \'123\'; val NUMERIC(10); BEGIN val := CAST(str AS NUMERIC); dbms_output.put_line(str || \'是[0-9]的数字序列\'); EXCEPTION WHEN value_error THEN -- 字符串转实数错误 --dbms_output.put_line(SQLCODE || \', \' || SQLERRM); dbms_output.put_line(str || \'不是[0-9]的数字序列\'); END; --调用translate函数,剔除所有[0-9]数字后,看是否为空串 DECLARE str VARCHAR2(10) := \'123abc\'; BEGIN IF replace(translate(str, \'0123456789\', \'0\'), \'0\', \'\') IS NULL THEN dbms_output.put_line(str || \'是[0-9]的数字序列\'); ELSE dbms_output.put_line(str || \'不是[0-9]的数字序列\'); END IF; END; --调用正则表达式,进行模式匹配(10g版本新加入的功能) SELECT * FROM dual WHERE regexp_like(\'1234\', \'^[[:digit:]]+$\'); --从任意字符串中提取数字串(调用2次translate函数)。 --假定初始串为str。首先将str中数字全部替换为空格,输出记为str2; --其次,对每个在str中出现的任意str2串中字符,如果是str2的首字符则替换为空格,其它字符则全部剔除 DECLARE --str VARCHAR2(100) := \' 护照01浙江2 3昆 山4苏 3\'; str VARCHAR2(100) := \' 护照浙江 昆 山苏 4\'; ret VARCHAR2(10); BEGIN ret := TRIM(TRANSLATE(str, trim(TRANSLATE(str, \'1234567890\', \' \')), \' \')); dbms_output.put_line(ret); END;
以上是关于Oracle中如何判断字符串是否全为数字的主要内容,如果未能解决你的问题,请参考以下文章