zoukankan      html  css  js  c++  java
  • Oracle中如何判断字符串是否全为数字,以及从任意字符串中提取数字

    本文介绍了判断字符串是否全为数字的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;

    上面的SQL代码,本人已经亲自测过。

    转载出处:http://blog.csdn.net/luocm/article/details/2648559

  • 相关阅读:
    Python中的try...except...finally
    JavaScript 实现双向队列并用此来测试一个单词是否为回文
    js 触发 change 事件
    MySQL8 重置改root密码及开放远程访问
    根据数组下标在MongoDB中修改数组元素
    pymongo CursorNotFound错误
    mongodb根据子项中的指标查找最小或最大值
    正则文本过滤时的一些注意事项
    github page更新后不生效
    Xpath同时选取不同属性的元素
  • 原文地址:https://www.cnblogs.com/hqbhonker/p/3457671.html
Copyright © 2011-2022 走看看