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

标签 mysql regex

我正在开发遗留软件,这不是开玩笑,在过去的十年里已经有十几个人在开发它。看起来确实如此。

我现在遇到的问题是某些记录包含“舞蹈规则”字符串,而不是记录 ID。太多其他代码依赖于这些字符串,让我来更改它。我不想向包含 ID 代码的表添加新字段,这样我就必须不断地将其与文本字段关联起来。我想保持现状,直到他们让我完全控制该项目,让我把它扔掉并重新开始。

问题是这样的:我们目前有四个舞蹈规则:

  • 男女同校
  • 准备
  • 嘻哈音乐
  • 扩展嘻哈音乐

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

  1. 嘻哈音乐
  2. 男女同校和嘻哈音乐
  3. 扩展嘻哈音乐
  4. 准备和扩展嘻哈音乐
  5. 男女混合、嘻哈和扩展嘻哈

不,这些不是唯一的组合。

我的问题在于找到“Hip Hop”,而不是“Expanded Hip Hop”。我在 StackOverFlow 上看到了其他回复,其中展示了如何使用正则表达式来匹配子字符串,但仅搜索“Hip Hop”将始终匹配“Expanded Hip Hop”。

使用上面的示例,搜索“Hip Hop”应该找到 1、2 和 5,但不是 3 或 4。该解决方案显然需要引用逗号和与号,但这些不只存在于列表中的单个项目。我刚刚为代码的这方面添加了添加/编辑/删除功能(奇怪的是十年来一直缺失),因此我不能再依赖于相同顺序的值。

最佳答案

您应该能够使用:

(^|[,&] )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 .

关于MYSQL:仅查找完整字符串,而不查找子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39981581/

相关文章:

MySQL 外键和查询

mysql - 如果一个值是另一列SQL中的某个值,如何从列中删除所有相同的值

mysql - 无法明确删除某些记录

php - 如何制作随时间递减的 Wilson 得分区间

php - 如何使用 PHP 查找字符串中的字符序列模式?

Javascript 遍历字符串寻找多个字符集

php - 获取没有文件的文件夹

javascript - 正则表达式 javascript 和替换

python - 从字符串中提取坐标

regex - Perl 正则表达式否定