MYSQL:只查找完整字符串,而不是子集

时间:2016-10-11 15:56:46

标签: mysql regex

我正在研究遗留软件,在过去的十年中,这个软件并没有开玩笑,已经有十多个人在使用它。看起来很棒。

我现在遇到的问题是某些记录包含“舞蹈规则”的字符串,而不是记录ID。太多的其他代码依赖于这些字符串作为字符串让我改变这一点。我不想在包含ID代码的表中添加新字段,然后我必须不断地与文本字段相关联。我想离开桌子,直到他们给我完全控制项目,让​​我扔掉它重新开始。

问题在于:我们目前有四条舞蹈规则:

  • 男女混合
  • 制备
  • Hip Hop
  • 扩展嘻哈

这些规则保存在除法类型表的“dance_rules”字段中的VARCHAR字段中。此字段的内容已预先格式化以显示:

  1. Hip Hop
  2. 男女同校&嘻哈
  3. 扩展嘻哈
  4. 准备&扩展嘻哈
  5. 男女同校,Hip Hop&扩展嘻哈
  6. 不,这些不是唯一的组合。

    我的问题在于寻找“嘻哈”,而不是“扩大嘻哈”。我在StackOverFlow上看到了其他响应,它们展示了如何使用正则表达式匹配子串,但只搜索“Hip Hop”将始终匹配“Expanded Hip Hop”。

    使用上面的例子,搜索“Hip Hop”应该找到1,2和5,但不能找到3或4.解决方案显然需要引用逗号和符号,但这些只有一个列表中的单个项目。我刚刚为代码的这个方面添加了一个添加/编辑/删除功能(这个功能已经奇怪地丢失了十年),所以我不能再依赖于相同顺序的值了。

2 个答案:

答案 0 :(得分:3)

你应该可以使用:

(^|[,&] )Hip

符合该要求,或者Hip有多种类型:

(^|[,&] )Hip Hop

如果列的开头有Hip,或者列Hip后跟&,,则会匹配。

SQL用法:

select id from dance where class regexp '(^|[,&] )Hip'

Regex101演示:https://regex101.com/r/8uY57D/1

最后让SQLFiddle执行:http://sqlfiddle.com/#!9/5f94bb/1

此处有关于角色类的信息,http://www.regular-expressions.info/charclass.html

答案 1 :(得分:2)

试试这个正则表达式。它涵盖了您的测试用例,以及任何" Hip Hop"在开头或之前是逗号或符号。

set @regexp1 = '^Hip Hop|(,|&) Hip Hop';

Execute:
> select 'Hip Hop' regexp @regexp1

+ ------------------------------ +
| 'Hip Hop' regexp @regexp1      |
+ ------------------------------ +
| 1                              |
+ ------------------------------ +
1 rows

Execute:
> select 'Co-ed & Hip Hop' regexp @regexp1

+ -------------------------------------- +
| 'Co-ed & Hip Hop' regexp @regexp1      |
+ -------------------------------------- +
| 1                                      |
+ -------------------------------------- +
1 rows

Execute:
> select 'Extended Hip Hop' regexp @regexp1

+ --------------------------------------- +
| 'Extended Hip Hop' regexp @regexp1      |
+ --------------------------------------- +
| 0                                       |
+ --------------------------------------- +
1 rows

Execute:
> select 'Prep & Expanded Hip Hop' regexp @regexp1

+ ---------------------------------------------- +
| 'Prep & Expanded Hip Hop' regexp @regexp1      |
+ ---------------------------------------------- +
| 0                                              |
+ ---------------------------------------------- +
1 rows

Execute:
> select 'Co-ed, Hip Hop & Expanded Hip Hop' regexp @regexp1

+ -------------------------------------------------------- +
| 'Co-ed, Hip Hop & Expanded Hip Hop' regexp @regexp1      |
+ -------------------------------------------------------- +
| 1                                                        |
+ -------------------------------------------------------- +
1 rows