`
superich2008
  • 浏览: 324393 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

mysql REGEXP 正则的实现两个字符串组的匹配

阅读更多
最近MySQL版块中类似问题出现得比较多。总结了一下。



由于某些原因,有时候我们没有按照范式的设计准则而把一些属性放到同一个字符串字段中。比如个人兴趣,有时候我们设计表为
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基于正则实现模糊替换字符串的方法分析

    MySQL支持的部分正则表达式元字符包括`.`(匹配任意字符,除了换行符)、`^`(匹配字符串开头)、`$`(匹配字符串结尾)、`*`(匹配前一个字符0次或多次)、`+`(匹配前一个字符1次或多次)、`?`(匹配前一个字符0次...

    MySQL正则表达式

    例如,`o{2}`不能匹配"Bob"中的`o`,但是能匹配"food"中的两个`o`。 - **`{n,m}`**:`m`和`n`均为非负整数,其中`n。最少匹配`n`次且最多匹配`m`次。 #### 五、案例分析 为了更好地理解如何在MySQL中使用正则表达式...

    MySQL中使用replace、regexp进行正则表达式替换的用法分析

    MySQL数据库作为最流行的开源数据库之一,提供了多种工具来执行这类操作,其中replace函数和regexp正则表达式是强大的工具。replace函数可以通过简单的字符串替换来更新数据,而regexp则可以使用复杂的正则表达式...

    mysql update正则替换sql语句

    在MySQL中,可以使用REGEXP和RLIKE操作符来实现正则表达式匹配。 首先,来看一个简单例子,如果要将字段中的字符串“test”替换为“abc”,可以使用如下语句: ```sql UPDATE test SET url = REPLACE(url, 'test',...

    MySQL中REGEXP正则表达式使用大全

    - 包含特殊字符的正则表达式可以匹配多个字符串。例如,'hello|word' 可以匹配 'hello' 或 'word'。 - 例如,正则表达式 'B[an]*s' 可以匹配 'Bananas', 'Baaaaas', 'Bs', 或其他以 'B' 开头以 's' 结束,中间有...

    MySQL的正则表达式

    MySQL 的正则表达式是 SQL 语言的一个子集,能够匹配基本的字符、字符串。以下是 MySQL 正则表达式的相关知识点: 1. 基本匹配:REGEXP 可以匹配基本的字符、字符串。例如:select * from wp_posts where post_name...

    SqlServer类似正则表达式的字符处理问题

    1. 同一个字符/字符串,出现了多少次 2. 同一个字符,第N次出现的位置 3. 多个相同字符连续,合并为一个字符 4. 是否为有效IP/身份证号/手机号等  一. 同一个字符/字符串,出现了多少次 同一个字符,将其替换为...

    mysql分割字符串

    在MySQL数据库中,有时我们需要处理存储在单一字段内的多个值,这时就涉及到字符串的分割操作。这个场景在处理如CSV格式的数据或者存储一串相关但独立的信息时尤为常见。本篇将详细介绍MySQL中的字符串分割技术及其...

    MySQL查询正则表达式.pdf

    - 正则表达式是一个字符串,它定义了一种字符串的模式,用于匹配符合该模式的其他字符串。 - 最简单的正则表达式就是直接使用待匹配的字符串,如`hello`只能匹配字符串`hello`。 2. **特殊字符与保留字**: - `^...

    mysql正则表达式(regexp和rlike)的搜索功能实例分析

    本文实例讲述了mysql正则表达式(regexp和rlike)的搜索功能。分享给大家供大家参考,具体如下: 我们知道正则表达式是描述搜索模式的特殊字符串。 它是一个强大的工具,为我们提供一种简洁灵活的方法来识别基于模式...

    SQL语句中设置多个字符串

    5. **正则表达式**:某些数据库系统,如MySQL、PostgreSQL支持正则表达式,可以实现更复杂的字符串匹配: ```sql -- MySQL示例 SELECT column_name FROM table_name WHERE column_name REGEXP '字符串1|字符串2';...

    正则表达式MySQL参考文档

    正则表达式在MySQL中的应用是数据库查询中的一个重要部分,它允许我们进行复杂的数据筛选和匹配操作。在MySQL中,正则表达式主要用于`WHERE`子句中的`REGEXP`或`RLIKE`操作符,使得我们可以根据模式匹配来查询数据。...

    evasnowind#ArchKnowledgeTree#mysql中使用replace和regexp实现正则替换1

    mysql的正则匹配用regexp,而替换字符串用REPLACE(str,from_str,to_str)例如更多例子如下:为了找出以“d”开头的名字,使用“^

    批量替换msyql字段内容

    `REPLACE()`函数用于在字符串中简单地查找并替换指定的字符或子串,而`REGEXP_REPLACE()`是MySQL 8.0版本引入的,它支持正则表达式的替换,功能更加强大。 1. `REPLACE()`函数: - 语法:`REPLACE(str, find_...

    MySQL 字符串模式匹配 扩展正则表达式模式匹配

    总的来说,MySQL的字符串模式匹配和扩展正则表达式模式匹配是数据库查询中非常实用的功能,能够帮助用户以各种方式过滤和检索数据,满足各种复杂的需求。通过熟练掌握这些技巧,可以极大地提升SQL查询的灵活性和实用...

    Mysql中正则表达式Regexp常见用法

    正则表达式在MySQL中的使用通过REGEXP和RLIKE运算符实现,这两个运算符在功能上是等价的。本文将详细探讨MySQL中正则表达式Regexp的一些常见用法和特点。 首先,正则表达式可以用来模糊匹配字符串。比如,如果我们...

    MySQL查询正则表达式[参考].pdf

    MySQL中的正则表达式是进行复杂查询的强大工具,它允许用户使用特定的语法来匹配一系列字符串。这篇资料简明扼要地介绍了正则表达式的使用方法。 正则表达式(regex)通过定义一种字符串模式来查找符合该模式的文本...

    mysql_regexp_replace.zip_oracle

    Oracle 的 `REGEXP_REPLACE` 函数允许用户使用正则表达式进行复杂的字符串替换操作,而 MySQL 中没有直接对应的内置函数。在这个主题中,我们将探讨如何在 MySQL 中模拟 Oracle 的 `REGEXP_REPLACE` 功能,并了解...

    MySQL使用正则表达式进行查询操作经典实例总结

    例如,`x{2,}`会匹配至少连续两个'x'的字符串,而`ba{1,3}`会匹配至少一个,最多三个连续'a'跟随'b'的记录。 通过这些例子,我们可以看到正则表达式在MySQL中的灵活性和实用性。它们可以帮助我们在处理大量文本数据...

Global site tag (gtag.js) - Google Analytics