zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    http编程中的get和post混合使用方式
    SQLServer实现作业依赖(非步骤)
    SQLServer实现两个库的字段长度自动更新
    Python+SQLite数据库实现服务端高并发写入
    sqlite数据库相关使用
    sqlite语法
    VBA关键字总结
    VS2005 .net2.0 TreeView.设置SelectedNodeStyle控制TreeView中选定节点的外观的
    SQLSERVER 2005 如何给sa用户设置空密码?
    解决超过远程连接数而无法连接服务器的问题 踢出已断开用户
  • 原文地址:https://www.cnblogs.com/stono/p/6671440.html
Copyright © 2011-2022 走看看