永发信息网

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

答案:2  悬赏:0  手机版
解决时间 2021-03-16 05:32
Oracle中如何判断字符串是否全为数字
最佳答案
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;
全部回答
可以使用正则表达式的方式来判断。  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,}$)'); 未选定行
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
摩托车火花塞怎么调摩托车基础知识
现如今的大学生为什么大部分都在混大学?中国
周末要去香港坐飞机,在番禺怎么去香港机场最
雅足道在哪里啊,我有事要去这个地方
息县曹黄林乡初级中学我想知道这个在什么地方
长春市昊龙空心砖厂地址有知道的么?有点事想
电信800m网速怎么样
没有美术的天赋,要学美术是不是很难学?
如何根除hpv,干扰素针剂的用量及用法?
洪泽龙虾馆(颛桥店)在哪里啊,我有事要去这个
水波窗帘的帘头怎么计算?高3.85,宽3.73。求
请问咸丰重宝当十五的真币尺寸和重量是多少?
天天香酒楼在哪里啊,我有事要去这个地方
河南在中国的那边
如何自制兰花需要的肥料
推荐资讯
曼斯贝塔厂家地址电话
长安铃木奥拓发动机有劲车速度上不去
恩格尔特地址在哪,我要去那里办事
马年女孩九月初一生好不好
请问《约会大作战》中 十香的武器叫什么杀公.
有没有安卓的自动打电话的软件,后台自己给一
滨桥邮政支局我想知道这个在什么地方
高中大学开校时间
桔子红童装超市在什么地方啊,我要过去处理事
两个人都是好几天没有联系对方了,怎么才知道
长江武汉通信局地址有知道的么?有点事想过去
考广州市公务员要看什么书的
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?