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 whereremove_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子句中的正则表达式或替换函数的主要内容,如果未能解决你的问题,请参考以下文章

20180813 mysql 数据查询

MySQL正则表达式匹配查询

mysql 正则表达式求解答

如何在WHERE子句中使用MS Access SQL子查询来替换长OR表达式

7_mysql查询之where子句

MySQL WHERE语句筛选操作符