主要懂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

REGEXP 正则的实现两个字符串组的匹配。(regexp)的更多相关文章

  1. js 正则匹配 两个字符串之间,某个字符串之前(之后)的内容

    1.js截取两个字符串之间的内容: var str = "aaabbbcccdddeeefff"; str = str.match(/aaa(\S*)fff/)[1]; alert ...

  2. RegExp正则匹配模式汇总

    正则表达式提供另一种强大的文本搜索和处理方式,对于正则表达式,不同语言有着不同的实现,JavaScript采用的Perl5的语法.对于极少数匹配模式是简单的全字符文本的情况,我们往往会采用indexO ...

  3. [Swift]LeetCode839. 相似字符串组 | Similar String Groups

    Two strings X and Y are similar if we can swap two letters (in different positions) of X, so that it ...

  4. [Swift]LeetCode893. 特殊等价字符串组 | Groups of Special-Equivalent Strings

    You are given an array A of strings. Two strings S and T are special-equivalent if after any number ...

  5. mysql 判断两个字符串是否存在包含关系-------(1,2,3)与(2,3)

    1.这里这个是目前有问题的   #创建FUNCTION  DELIMITER ;     CREATE FUNCTION `is_mixed`(str1 TEXT, str2 TEXT) RETURN ...

  6. LeetCode.893-特殊相等字符串组(Groups of Special-Equivalent Strings)

    这是悦乐书的第344次更新,第368篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第209题(顺位题号是893). You are given an array A of ...

  7. js进阶js中支持正则的四个常用字符串函数(search march replace split)

    js进阶js中支持正则的四个常用字符串函数(search march replace split) 一.总结 代码中详细四个函数的用法 search march replace split 二.js进 ...

  8. js截取两个字符串之间的子字符串

    // 截取两个字符串之间的子字符串,返回第一个 function subStringOne(text, begin, end) { var regex; if (end == '\\n') regex ...

  9. [LeetCode] 839. Similar String Groups 相似字符串组

    Two strings X and Y are similar if we can swap two letters (in different positions) of X, so that it ...

随机推荐

  1. es6中的promise对象

    Promise是异步里面的一种解决方案,解决了回调嵌套的问题,es6将其进行了语言标准,同意了用法,提供了`promise`对象, promise对象有三种状态:pending(进行中) .Resol ...

  2. enum 与 enum class

    c++11中引入了新的枚举类型---->强制枚举类型 // unscoped enum: enum [identifier] [: type] {enum-list};  // scoped e ...

  3. Unity NGUI添加UIRoot

    导入NGUI包后,菜单多出一个选项 "NGUI",选择其子选项 "options" -- "Reset Prefab ToolBar" ,在 ...

  4. 【iBeacon】iBeacon前沿初探技术备忘

    iBeacon是工作在蓝牙4.0(BLE)硬件下的一种协议,属于蓝牙4.0广播协议的一种,通过该协议和一个蓝牙模块可以实现非接触的身份识别.位置检测等. How does BLE communicat ...

  5. HTML DOM Event 对象

    var event;if (document.createEvent){event = document.createEvent("HTMLEvents");event.initE ...

  6. centos系统/etc/sysconfig/目录下无iptables文件

    原因一般是没有配置过防火墙,在安装linux系统时也已经禁掉了防火墙 随便写一条iptables命令配置个防火墙规则:如: iptables -P OUTPUT ACCEPT 然后用命令:servic ...

  7. 裸奔单片机GUI

    #include "main.h"#ifndef __STD_GUI_CONTEX__#define __STD_GUI_CONTEX__ #define CPSTRSIZE 20 ...

  8. ProtocolBuffers-3 For Objective C (1)-简单的使用

    一. 介绍 Protocolbuffer 是一种数据交换格式,类似于我们现在使用的XML和JSON.是Google公司推出的,本来这个语言是Google公司内部使用的,随着Google对这个格式的优化 ...

  9. 如何用qq代理发送邮件

    今天我想写一篇服务器发送验证邮件的的文章,我查阅过其他博客里面写的文章,都是可以实现的,但是对于初学者来说是一个很痛苦的事情,很多代码看不懂,原因有多种,写的多,写的乱,然后就不想往下看了.我今天详细 ...

  10. ios语音识别

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #000000; min-height: 15.0px } p.p ...