mysql查询的where子句中的正则表达式或替换函数
Posted
技术标签:
【中文标题】mysql查询的where子句中的正则表达式或替换函数【英文标题】:regular expression or replace function in where clause of a mysql query 【发布时间】:2010-04-07 08:34:46 【问题描述】:我写了一个mysql查询
select * from table where name like '%salil%'
效果很好,但不会返回名称为“sal-il”、“sa@lil”的记录。
所以我想要一个类似下面的查询
select * from table where
remove_special_character_from(name)like '%salil%'
remove_special_character_from(name) 是一个 mysql 方法或正则表达式,它在执行之前从 name 中删除所有特殊字符。
【问题讨论】:
【参考方案1】:不,mysql 不支持基于正则表达式的替换。 我建议使用搜索词的标准化版本,存储在单独的字段中。
因此,在插入时,您从数据中删除所有非字母字符并将其存储在 data_norm
字段中以供将来搜索。
【讨论】:
【参考方案2】:由于我不知道如何做到这一点,我会为此使用“计算列”,即取决于name
的值但没有特殊字符的列。这样,转换成本只需支付一次,您甚至可以在新列上创建索引。
请参阅this answer 如何执行此操作。
【讨论】:
【参考方案3】:我同意Aaron 和Col. Shrapnel 的观点,即您应该在表格上使用额外的列,例如search_name
存储名称的规范化版本。
我注意到这个问题最初被标记为 ruby-on-rails。如果这是 Rails 应用程序的一部分,那么您可以使用 before_save 回调来设置此字段的值。
【讨论】:
【参考方案4】:在 MYSQL 5.1 中你可以使用REGEXP
来做这样的正则表达式匹配
SELECT * FROM foo WHERE bar REGEXP "baz"
见http://dev.mysql.com/doc/refman/5.1/en/regexp.html
但是,请注意,它会缓慢,您应该按照其他张贴者的建议进行操作,并将干净的值存储在单独的字段中。
【讨论】:
以上是关于mysql查询的where子句中的正则表达式或替换函数的主要内容,如果未能解决你的问题,请参考以下文章