问题描述

比如table1中有两条记录 
name no 
a    2,9 
b    8,10

然后有一串字符串,是0,1,2,3,4

然后通过一条sql,找出no为2,9的记录来```

因为字符串中有2,数据中也有2

详细解释 
------------------------------ 
表的字段就是 
name  no     
a     2,9    
b     8,10   
字符串是str="0,1,2,3,4" 
接下来就是查 no字段里跟str里有交集的记录 
查询的结果就是name=a的,no=2,9的 
------------------------------

答案是:

  1. select * from table1 where concat(',',no,',') regexp concat(',0,|,1,|,2,|,3,|,4,');

或者:

  1. select * from table1 where concat(',',no,',') regexp concat(',(',replace('0,1,2,3,4',',','|'),'),');

下面是扩展学习:

由于某些原因,有时候我们没有按照范式的设计准则而把一些属性放到同一个字符串字段中。比如个人兴趣,有时候我们设计表为 
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条记录被选中。

当然也可以利用这种正则式 ',阅读,|,交友,|,围棋,|,足球,|,滑雪,', 但效率显然不如 ',(阅读|交友|围棋|足球|滑雪),' 这种了。

转载:http://www.cnblogs.com/whoamme/p/4252306.html

正则匹配

mysql> select '123|124|125' regexp '123|126';
+--------------------------------+
| '123|124|125' regexp '123|126' |
+--------------------------------+
| |
+--------------------------------+
row in set (0.00 sec) mysql> select '122|124|125' regexp '123|126';
+--------------------------------+
| '122|124|125' regexp '123|126' |
+--------------------------------+
| |
+--------------------------------+
row in set (0.00 sec) mysql>

转载:http://bbs.csdn.net/topics/390683163

Mysql 正则获取字段的交集【转】的更多相关文章

  1. MySQL 表与字段编码格式报错

    MySQL 表与字段编码格式报错 一.数据库,表,字段编码格式都为latin1(iso-8859-1) .当数据保存到数据库后,中文显示乱码. 解决办法: 1.在访问数据库连接串中添加编码格式: &l ...

  2. kettle不能正常自动获取字段

     Unable to close prepared statement after determining SQL layoutYou have an error in your SQL syntax ...

  3. mysql正则查询 模糊查询

    -- ==============正则查询================ /* SQL默认是忽略大小写的 正则模式使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们 ...

  4. JDBC读写MySQL的大字段数据

    JDBC读写MySQL的大字段数据   不管你是新手还是老手,大字段数据的操作常常令你感到很头痛.因为大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式 来处理的.而非一般的字段 ...

  5. mysql update获取主键

    mysql update获取主键<pre>SET @update_id := 0;UPDATE mobantestinfo1 SET info2 = 'value', id = (SELE ...

  6. 【Java/JDBC】利用ResultSetMetaData从数据库的某表中获取字段信息并存到csv文件

    代码下载:https://files.cnblogs.com/files/xiandedanteng/FindNotnullColumns20191102-2.rar 这篇还不够完善,请看更完善的续篇 ...

  7. MySQL中获取天、周、月等数据

    MySQL中获取天.周.月等数据 1.今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 2.昨天 SELECT * FROM 表名 ...

  8. MySQL 对 IP 字段的排序问题

    MySQL 对 IP 字段的排序问题 问题描述 想对一张带有 IP 字段的表,对 IP 字段进行升序排序,方便查看每个段的 IP 信息. 表结构和表数据如下: SET NAMES utf8mb4; ; ...

  9. mybatis&plus系列------Mysql的JSON字段的读取和转换

    mybatis&plus系列------Mysql的JSON字段的读取和转换 一. 背景 在平常的开发中,我们可能会有这样的需求: 业务数据在存储的时候,并不是以mysql中的varchar丶 ...

随机推荐

  1. Specialized Four-Digit Numbers

    Problem Description Find and list all four-digit numbers in decimal notation that have the property ...

  2. 批量更新memcached缓存

    假如系统里有3类数据company,user,product 利用维护版本号version的方式达到批量更新缓存的效果 memcache.Add("company",cversio ...

  3. VMware系统运维(五)安装SSO vCenter Single Sign-On

    1.前面我们做了很多准备工作,安装了很多需求部件,这时候再安装,必备条件无,这是简单安装,即自动安装,点击"安装". 2.简单安装,提示内存不足,需要4GB以上,加内存,重新安装. ...

  4. KDE声音服务器 arts

    KDE声音服务器 arts arts介绍arts是KDE的核心声音系统,支持多音频流.全双工.网络声音请求.ALSA与OSS驱动后端.JACK声音服务器后端等扩展,它既是声音服务器,也 提供一套音频软 ...

  5. 搭建第一个web项目:jasperReports+ireport制作pdf报表

    一:jasperReports介绍: 在web应用中,必须面临大量的报表问题,即将数据库中的数据形成报表并进行打印.传统开发只能使用html页面设计报表,效率低且不支持别的格式.所以jasperRep ...

  6. CF Set of Strings

    Set of Strings time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  7. 转: ios app架构设计

    http://keeganlee.me/post/architecture/20160107 看完这一系列文章后就知道怎么回答这类问题了: App架构设计经验谈:接口的设计 App架构设计经验谈:技术 ...

  8. 设置UITableView背景透明/监听cell左边的删除按钮的点击事件

    _tableView = [[UITableView alloc] init]; _tableView.delegate = self; _tableView.dataSource = self; _ ...

  9. sharepoint 2013 "The module ... owssvr.dll could not be loaded due to a configuration problem"

    打开sharepoint站点可以看到这个503的错误, 在event viewer中查看如下: The Module DLL 'C:\Program Files\Common Files\Micros ...

  10. 提高HTML5 Canvas性能的技巧

    详细内容请点击 一:使用缓存技术实现预绘制,减少重复绘制Canvs内容 很多时候我们在Canvas上绘制与更新,总是会保留一些不变的内容,对于这些内容 应该预先绘制缓存,而不是每次刷新. 直接绘制代码 ...