当前位置: 首页 > news >正文

REGEXP 正则的实现两个字符串组的匹配。(regexp)

主要懂3个mysql的方法:replace【替换】   regexp【正则匹配】    concat【连接】
 
由于某些原因,有时候我们没有按照范式的设计准则而把一些属性放到同一个字符串字段中。比如个人兴趣,有时候我们设计表为
create table members (uid int primary key,uname varchar(20),hobby varchar(100));
表中内容如下
mysql> select * from members;
+-----+-------+---------------------------------+
| uid | uname | hobby                           |
+-----+-------+---------------------------------+
|   1 | AAAA  | 音乐,电影,网络,篮球,阅读,乒乓球 |
|   2 | BBBB  | 音乐,阅读,乒乓球,发呆,围棋,参禅 |
|   3 | CCCC  | 交友,乒乓球                     |
|   4 | DDDD  | 台球,网络,看书,旅游             |
|   5 | EEEE  | 音乐,发呆,下围棋,参禅           |
+-----+-------+---------------------------------+
4 rows in set (0.00 sec)
 
如果我们现在想查找一个与某个用户X (阅读,交友,围棋,足球,滑雪)有着相同爱好的会员记录 如果来操作呢?
在其它数据库中,我们能只通过程序来或者存储过程来分解这个 "阅读,交友,围棋,足球,滑雪" 字符串为单独的爱好项目,然后一个一个进行 like '%xxxx%' 来查询。 但在MySQL中我们可以直接利用这个regexp正规表达式 来构造SQL语句来实现。
 
首先我们把 '阅读,交友,围棋,足球,滑雪' 转换成为正则式 为 '阅读|交友|围棋|足球|滑雪' ,  | 在正则表达式中为 '或' 的意思
mysql> select replace('阅读,交友,围棋,足球,滑雪',',','|');
+---------------------------------------------+
| replace('阅读,交友,围棋,足球,滑雪',',','|') |
+---------------------------------------------+
| 阅读|交友|围棋|足球|滑雪                    |
+---------------------------------------------+
1 row in set (0.00 sec)
 
这样我们可以用SQL语句如下。
mysql> select * from members where hobby regexp replace('阅读,交友,围棋,足球,滑雪',',','|');
+-----+-------+---------------------------------+
| uid | uname | hobby                           |
+-----+-------+---------------------------------+
|   1 | AAAA  | 音乐,电影,网络,篮球,阅读,乒乓球 |
|   2 | BBBB  | 音乐,阅读,乒乓球,发呆,围棋,参禅 |
|   3 | CCCC  | 交友,乒乓球                     |
|   5 | EEEE  | 音乐,发呆,下围棋,参禅           |
+-----+-------+---------------------------------+
3 rows in set (0.00 sec)
 
如上语句我们可以通过一句SQL得到所有hobby包含 '阅读,交友,围棋,足球,滑雪' 任一项的记录。
但上述的语句中还有一点小的缺陷,那就是把 '下围棋' 这一条也选择了出来,如果精确匹配的话这条记录不应该被选中。为了避免这种情况,我们对SQL语句做如下改进。
 
把正则式改为 ',(阅读|交友|围棋|足球|滑雪),'  也就是要求匹配项前后必须有一个界定符","
 
mysql> select concat(',(',replace('阅读,交友,围棋,足球,滑雪',',','|'),'),');
+---------------------------------------------------------------+
| concat(',(',replace('阅读,交友,围棋,足球,滑雪',',','|'),'),') |
+---------------------------------------------------------------+
| ,(阅读|交友|围棋|足球|滑雪),                                  |
+---------------------------------------------------------------+
1 row in set (0.00 sec)
 
mysql> select * from members
    -> where concat(',',hobby,',') regexp
    ->   concat(',(',replace('阅读,交友,围棋,足球,滑雪',',','|'),'),');
+-----+-------+---------------------------------+
| uid | uname | hobby                           |
+-----+-------+---------------------------------+
|   1 | AAAA  | 音乐,电影,网络,篮球,阅读,乒乓球 |
|   2 | BBBB  | 音乐,阅读,乒乓球,发呆,围棋,参禅 |
|   3 | CCCC  | 交友,乒乓球                     |
+-----+-------+---------------------------------+
3 rows in set (0.00 sec)
这样避免了第5条记录被选中。
 
当然也可以利用这种正则式 ',阅读,|,交友,|,围棋,|,足球,|,滑雪,', 但效率显然不如 ',(阅读|交友|围棋|足球|滑雪),' 这种了。
 
参考文档:
 
MySQL 5.1参考手册 - 12.3.1. 字符串比较函数 - REGEXP (RLIKE)
http://dev.mysql.com/doc/refman/5.1/zh/functions.html#string-comparison-functions
 
MySQL 5.1参考手册 - 附录G:MySQL正则表达式
http://dev.mysql.com/doc/refman/5.1/zh/regexp.html

转载于:https://www.cnblogs.com/hfdp/p/6026548.html

相关文章:

  • ImageLoader
  • 互联网盈利模式研习笔记之二:佣金与分成
  • usb_modeswitch使用详解
  • 能源项目xml文件 -- app-datasource.xml
  • 微小宝中实际支出是如何计算的?
  • python ipaddress模块使用
  • SQLAlchemy ORM高级查询之过滤,排序
  • 杰卡德距离
  • 利用beans.xml进行简单的Spring应用上下文创建与使用
  • javaScript的正则表达式 (一)
  • spark学习1(hadoop集群搭建)
  • 记录水电系统开发的心理【1】
  • MySQL -- 关闭 binlog
  • MySQL密码丢失,解决方法
  • shell自动备份文件或目录到本地和远程主机
  • @angular/forms 源码解析之双向绑定
  • 0x05 Python数据分析,Anaconda八斩刀
  • CSS 三角实现
  • golang中接口赋值与方法集
  • mysql innodb 索引使用指南
  • sessionStorage和localStorage
  • springboot_database项目介绍
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 简单实现一个textarea自适应高度
  • 聚类分析——Kmeans
  • 你不可错过的前端面试题(一)
  • 项目实战-Api的解决方案
  • 一个SAP顾问在美国的这些年
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • PostgreSQL之连接数修改
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​渐进式Web应用PWA的未来
  • ( 10 )MySQL中的外键
  • (42)STM32——LCD显示屏实验笔记
  • (Ruby)Ubuntu12.04安装Rails环境
  • (二)hibernate配置管理
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)计算机毕业设计ssm电影分享网站
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (五)网络优化与超参数选择--九五小庞
  • (转)树状数组
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .Net 知识杂记
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .net分布式压力测试工具(Beetle.DT)
  • .NET开发者必备的11款免费工具
  • .NET命令行(CLI)常用命令
  • .NET企业级应用架构设计系列之应用服务器
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • ::before和::after 常见的用法
  • @Bean, @Component, @Configuration简析
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • [BUUCTF 2018]Online Tool(特详解)