我正在开发遗留软件,这不是开玩笑,在过去的十年里已经有十几个人在开发它。看起来确实如此。
我现在遇到的问题是某些记录包含“舞蹈规则”字符串,而不是记录 ID。太多其他代码依赖于这些字符串,让我来更改它。我不想向包含 ID 代码的表添加新字段,这样我就必须不断地将其与文本字段关联起来。我想保持现状,直到他们让我完全控制该项目,让我把它扔掉并重新开始。
问题是这样的:我们目前有四个舞蹈规则:
- 男女同校
- 准备
- 嘻哈音乐
- 扩展嘻哈音乐
这些规则保存在分区类型表的“dance_rules”字段中的 VARCHAR 字段中。该字段的内容已预先格式化以供显示:
- 嘻哈音乐
- 男女同校和嘻哈音乐
- 扩展嘻哈音乐
- 准备和扩展嘻哈音乐
- 男女混合、嘻哈和扩展嘻哈
不,这些不是唯一的组合。
我的问题在于找到“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/