Oracle--正则表达式例子

本文详细介绍了如何利用SQL查询和正则表达式来筛选数据库中的特定记录,包括查找非纯数字记录、特定数字开头的记录、包含空白、小写字母或数字、标点符号的记录等。同时,展示了如何验证字符串是否全由数字组成、通过ASCII码判断数字、使用cast函数转换字符串为数字、以及通过translate函数去除非数字字符并检查剩余内容是否为空。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-- 查询value中不是纯数字的记录
select * from fzq ;
select * from fzq where  regexp_like(value,'^[[:digit:]]+$');--以数字开头,并且匹配多次,直到结尾
select * from fzq where  regexp_like(value,'^[[:digit:]]+');--以数字开头,并且含有一个或多个的结果集

-- 查询value中不包含任何数字的记录。
select * from fzq where regexp_like(value,'^[^[:digit:]]+$');--以非数字开头,匹配多次直到结尾

--查询以12或者1b开头的记录.区分大小写。
select * from fzq where regexp_like(value,'^1[2B]');

--查询以12或者1b开头的记录.不区分大小写。
select * from fzq where regexp_like(value,'^1[2b]','i');

-- 查询数据中包含空白的记录。
select * from fzq where regexp_like(value,'[[:space:]]');

--查询全是小写字母或者数字的记录。
select * from fzq where regexp_like(value,'^([a-z]+|[0-9]+)$');

--查询任何包含标点符号的记录。
select * from fzq where regexp_like(value,'[[:punct:]]');

--查询value中含有以1开头60结束字符串的记录并且长度是7位
select * from fzq where value like '1____60';
select * from fzq where regexp_like(value,'1....60');

--查询value中以1开头60结束的记录并且长度是7位并且全部是数字的记录。
select * from fzq where regexp_like(value,'^1[0-9]{4}60$');
--也可以这样实现,使用字符集。
select * from fzq where regexp_like(value,'^1[[:digit:]]{4}60$');


匹配serv_number字段全是数字的数据行

1:正则表达式(10g版本新加入的功能)
select * from vgopbme.vgop_dept_wh_20150416 t  where regexp_like(t.serv_number ,'^[0-9]+$');
select * from vgopbme.vgop_dept_wh_20150416 t  where  regexp_like(t.serv_number ,'^[[:digit:]]+$');

2:通过ASCII码判断是否数字,介于[48, 57]之间,(ascii('0') = 48, ascii('9') = '57')
--通过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;

3:调用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;

4:调用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;


TRANSLATE是REPLACE所提供的功能的一个超集。
一、语法: 
    TRANSLATE(string,from_str,to_str) 
二、目的 
    将(所有出现的)from_str中的每个字符替换为to_str中的相应字符。
    如果from_str比to_str长,那么在from_string的后边超出的部分都被替换为空值,因为它们没有相应的替换字符。
    to_str不能为空。Oracle将空字符串解释为NULL,并且如果TRANSLATE中的任何参数为NULL,那么结果也是NULL .

SELECT TRANSLATE('abcdefghij','abcdef','123456')   FROM   dual;    
TRANSLATE   (    
--------------    
123456ghij    

select TRANSLATE('护照01浙江2 3昆 山4苏 3', '0123456789','a') from dual;--护照a浙江 昆 山苏
--将0替换为a,并且将1-9删除;
select TRANSLATE('护照01浙江2 3昆 山4苏 3', '0123456789','ab') from dual;--护照ab浙江 昆 山苏
--将0替换为a,1替换为b,将2-9删除;
select TRANSLATE('护照01浙江2 3昆 山4苏 3', '2301456789','ab') from dual;--护照浙江a b昆 山苏 b
--将2替换为a,3替换为b,剔除01456789;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值