正则表达式或替换mysql查询的where子句中的函数

时间:2010-04-07 08:34:46

标签: regex mysql

我写了一个mysql查询

select * from table where name like '%salil%'

工作正常,但不会返回名为'sal-il'的记录,'sa @lil'。

所以我想要一个类似下面的查询

select * from table where remove_special_character_from(名称) like '%salil%'

remove_special_character_from(name)是一个mysql方法或正则表达式,它在执行之前从名称中删除所有特殊字符。

4 个答案:

答案 0 :(得分:1)

不,mysql不支持基于regexp的替换 我建议使用存储在单独字段中的搜索术语的规范化版本。

因此,在插入时,您从数据中删除所有非字母字符,并将其存储在data_norm字段中以供将来搜索。

答案 1 :(得分:1)

由于我知道无法做到这一点,我会为此使用“计算列”,即一列取决于name但没有特殊字符的值。这样,转换的成本只支付一次,您甚至可以在新列上创建索引。

请参阅this answer如何执行此操作。

答案 2 :(得分:1)

我同意AaronCol. Shrapnel您应该在表格中使用额外的列,例如search_name用于存储名称的规范化版本。

我注意到这个问题最初被标记为ruby-on-rails。如果这是Rails应用程序的一部分,那么您可以使用before_save回调来设置此字段的值。

答案 3 :(得分:0)

在MYSQL 5.1中,您可以使用REGEXP进行正常的表达式匹配,如此

   SELECT * FROM foo WHERE bar REGEXP "baz"

请参阅http://dev.mysql.com/doc/refman/5.1/en/regexp.html

但是,请注意它将,您应该执行其他海报建议的操作,并将清洁值存储在单独的字段中。