oracle中如何判断字符串是否全为数字,以及从任意字符串中提取数字

本文介绍了四种判断字符串是否全由数字组成的实用方法,并提供了一种利用translate函数从任意字符串中提取数字的技巧。

  本文介绍了判断字符串是否全为数字的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判断字符串是否数字有以下几种方法: 1. **使用ASCII码遍历判断**:通过遍历字符串的每个字符,使用`ascii`函数获取字符的ASCII码值,判断是否数字的ASCII码范围(48 - 57)内。示例代码如下: ```sql DECLARE str VARCHAR2(100) := 'your_string'; flag BOOLEAN := TRUE; i NUMBER := 1; k NUMBER; BEGIN WHILE i <= LENGTH(str) LOOP k := ascii(substr(str, i, 1)); IF k < 48 OR k > 57 THEN flag := FALSE; END IF; i := i + 1; END LOOP; IF flag = true THEN dbms_output.put_line(str || '是[0-9]的数字序列'); ELSE dbms_output.put_line(str || '不是[0-9]的数字序列'); END IF; END; ``` 此方法能精确判断每个字符是否数字,但代码相对复杂,需要使用循环和条件判断[^2]。 2. **使用REPLACE加TRANSLATE函数**:使用`REPLACE`函数字符串中的小数点替换为空,再使用`TRANSLATE`函数数字字符替换为空,若最终结果为`NULL`,则表示字符串数字。可以直接使用`TRANSLATE(REPLACE('入参','.',''),'/1234567890','/') IS NULL`来判断。不过,若入参有2个小数点或含有加减号则不能准确判断[^1][^3]。 3. **调用cast函数尝试强制转换**:尝试将字符串强制转换成`NUMERIC`或`NUMBER`类型,如果不是合法数字串则会抛出异常。这种方法利用了Oracle的类型转换机制,但会抛出异常,在实际使用时需要进行异常处理[^2]。 4. **使用TO_NUMBER或REGEXP_LIKE自定义函数**:可以使用`TO_NUMBER`函数尝试将字符串转换为数字,若转换失败则不是数字字符串;也可以使用`REGEXP_LIKE`函数结合正则表达式判断字符串是否数字。例如使用正则表达式`^[0-9]+$`来匹配数字字符串。使用自定义函数可以封装逻辑,方便复用,但需要编写额外的函数代码[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值