永发信息网

Oracle中如何判断字符串是否全为数字

答案:2  悬赏:0  手机版
解决时间 2021-03-16 05:32
  • 提问者网友:孤山下
  • 2021-03-15 20:34
Oracle中如何判断字符串是否全为数字
最佳答案
  • 五星知识达人网友:老鼠爱大米
  • 2021-03-15 22:13
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;
全部回答
  • 1楼网友:往事隔山水
  • 2021-03-15 22:59
可以使用正则表达式的方式来判断。  regexp_like( 字段 , '(^[+-]?\d{0,}\.?\d{0,}$)' 来判断 是否是数字 sql> select null   2  from dual   3  where regexp_like(null,'(^[+-]?\d{0,}\.?\d{0,}$)'); 未选定行 sql>  sql> select 'abc'    2  from dual   3  where regexp_like('abc','(^[+-]?\d{0,}\.?\d{0,}$)'); 未选定行 sql>  sql> select '100'    2  from dual   3  where regexp_like('100','(^[+-]?\d{0,}\.?\d{0,}$)'); '10 --- 100 sql>  sql> select '-100'    2  from dual   3  where regexp_like('-100','(^[+-]?\d{0,}\.?\d{0,}$)'); '-10 ---- -100 sql>  sql> select '.01'    2  from dual   3  where regexp_like('.01','(^[+-]?\d{0,}\.?\d{0,}$)'); '.0 --- .01 sql>  sql> select '1995-10-1'    2  from dual   3  where regexp_like('1995-10-1','(^[+-]?\d{0,}\.?\d{0,}$)'); 未选定行 sql>  sql> select '1/20/95'    2  from dual   3  where regexp_like('1/20/95','(^[+-]?\d{0,}\.?\d{0,}$)'); 未选定行
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯