mysql---like-REGEXP

Mysql正则表达式实战
本文介绍Mysql中正则表达式的应用,通过实例对比LIKE与REGEXP的区别,强调了REGEXP支持的部分匹配特性,并提供了如何区分大小写的解决方案。

1.  Mysql的正则表达式仅仅是SQL语言的一个子集,可以匹配基本的字符、字符串。 
例如:select * from wp_posts where post_name REGEXP 'hello',可以检索出列post_name中所有包含字符串hello的行 
    REGEXP '.og'  .是正则表达式中里一个特殊的字符。它表示匹配一个字符,因此,dog,hog,mog等等都能匹配。

注意: 
    关于LIKE和REGEXP的区别:

#使用like语句查询prod_name=1000的数据

输入:SELECT prod_id , prod_name FROM products WHERE prod_name LIKE '1000';

输出:

可以看到输出为空,即什么也没输出。难道说数据表中并没有prod_name=1000的数据吗?

#使用正则表达式REGEXP

输入:SELECT prod_id , prod_name FROM products WHERE prod_name REGEXP'1000';

输出:+---------------+

         prod_name

      +---------------+

        JetPack 1000

      +----------------+

原因:Like匹配整个字段,而正则表达式regexp在列值内进行部分匹配,只要一部分满足正则规则则匹配成功;

个人理解:like匹配的是被匹配字段的整个值,只有被匹配字段的全部字符被包含在like中的时候才算匹配成功,;而正则表达式REGEXP则是匹配规则中的字符规则只要在被匹配字段的值中出现就算是匹配成功,返回行。例如:假如字段的值是abcd,like 'abc' 匹配失败, REGEXP ‘abc’匹配成功;

    关于大小写的区分:MySQL中正则表达式匹配(从版本3.23.4后)不区分大小写 。如果要区分大小写,应该使用BINARY关键字,如where post_name REGEXP BINARY 'Hello .000'

### ### `REGEXP_REPLACE` 函数的基本语法 `REGEXP_REPLACE` 是 SQL 中用于正则表达式替换的函数,常用于清理或格式化字符串数据。其基本语法如下: ```sql REGEXP_REPLACE(source_string, pattern, replacement_string) ``` - `source_string`:原始字符串或字段名。 - `pattern`:用于匹配的正则表达式模式。 - `replacement_string`:用于替换匹配内容的字符串。 该函数支持在匹配模式中使用分组,并通过 `\1`, `\2`, ... 引用这些分组,实现复杂的替换逻辑。 ### ### 示例一:替换字段中的特定模式 在处理字段值时,例如将字符串 `[234]7890` 中的 `[234]` 替换为 `[123]`,可以使用如下语句: ```sql UPDATE ITEMS SET SUMMARY = REGEXP_REPLACE(SUMMARY, '$.*$', '[123]') WHERE ID = 32860; ``` 此语句中,正则表达式 `$.*$` 匹配以 `[` 开始、`]` 结束的任意内容,将其替换为 `[123]`,最终结果为 `[123]7890` [^1]。 ### ### 示例二:提取并格式化字符串中的首字母 结合正则分组功能,可以提取字符串中多个单词的首字母并格式化输出。例如将 `'Zhao Yan Dong'` 转换为 `'Z.Y.D'`: ```sql WITH t AS ( SELECT 'Zhao Yan Dong' AS aa FROM dual ) SELECT REGEXP_REPLACE(aa, '([[:upper:]])(.*)([[:upper:]])(.*)([[:upper:]])(.*)', '\1.\3.\5') AS formatted FROM t; ``` 此语句通过正则表达式匹配每个单词的首字母(大写字母),并通过 `\1.\3.\5` 实现首字母提取格式化,结果为 `Z.Y.D` [^2]。 ### ### 示例三:解析并拆分字符串中的函数参数 在解析包含函数调用的字符串时,例如提取 `ROUND(SAL)` 中的函数名参数,可以使用如下语句: ```sql WITH a AS ( SELECT REGEXP_SUBSTR(QUERY1, 'ROUND$$[^)]+', 1, 1) AS ROUNDA, QUERY1 FROM V13_1 WHERE REGEXP_LIKE(QUERY1, 'ROUND$$', 'i') ) SELECT QUERY1, ROUNDA, REGEXP_REPLACE(ROUNDA, '(ROUND)$$([^,]+),?([^)]*)$', '\1') AS FUN, REGEXP_REPLACE(ROUNDA, '(ROUND)$$([^,]+),?([^)]*)$', '\2') AS P1, REGEXP_REPLACE(ROUNDA, '(ROUND)$$([^,]+),?([^)]*)$', '\3') AS P2 FROM a; ``` 该查询使用正则表达式 `(ROUND)$$([^,]+),?([^)]*)$` 拆分函数名参数,并分别提取函数名(`\1`)、第一个参数(`\2`)第二个参数(`\3`),实现结构化输出 [^3]。 ### ### 使用 `REGEXP_REPLACE` 的注意事项 - **正则表达式语法差异**:不同数据库系统对正则表达式的支持略有不同,例如 Oracle 使用 `[[:upper:]]` 表示大写字母,而 MySQL 使用 `[A-Z]`。 - **性能影响**:正则表达式匹配替换可能对性能有一定影响,尤其是在处理大规模数据时。 - **测试验证**:在正式执行替换操作前,建议先使用 `SELECT` 验证正则表达式是否匹配预期内容,避免误操作。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值