MySQL中是否有一种方法可以使用包含或不包含标点符号(如撇号和连字符)的LIKE语句返回结果?
例如,如果我有以下查询之一:
SELECT * FROM some_table WHERE some_value LIKE "%this-thing%";或
SELECT * FROM some_table WHERE some_value LIKE "%person's thing%"是否有一种方法可以获得与下面的查询相同的结果,但使用一个LIKE子句?
SELECT * FROM some_table WHERE (some_value LIKE "%this-thing%") OR (some_value LIKE "%this thing%");或
SELECT * FROM some_table WHERE (some_value LIKE "%person's thing%") OR (some_value LIKE "%persons thing%");基本上是一个函数,在搜索时,如果文本的任一版本存在("person's thing“或”person‘s thing"),则返回结果,类似于:
mysql中是否有一个函数只返回列中的alpha数字字符?例如,如果列值中有“某某物&其他东西”,那么它将作为“某样东西-其他东西”返回?因此,查询应该类似于:
SELECT * FROM table WHERE magic_function(column_name) LIKE '%words%'目前,我已经通过将REPLACE()链接在一起,并在进行比较之前将列值中的所有特殊字符替换为"“来解决这个问题。被比较的值也被去掉了所有的特殊字符。
发布于 2017-11-15 08:36:45
不久前我也有过类似的情况。这是一个爱尔兰的项目,为一个文化组织的成员制度,其中一个要求是,该系统处理爱尔兰名字。
爱尔兰名称可能非常复杂,包括O、O'、Ó、Ó'、Mac、Mc'、Mc (所有名称后面都有空格或不带空格),在某些情况下,像Ua hÚigínn这样的名称(不是一个错误--后面跟着大写Ú的小h在爱尔兰语中是正确的)。正如你所看到的,也有重音字符(a,e,i,o和u可以带有尖锐的口音)。问题是,许多人使用这些名称的许多不同变体,包括/不带撇号、重音和其他拼写。
您可以将这些看作是some_value字段中的不同拼写!
我们所做的就是创建一个“影子”(some_value_search)列,并对其进行搜索!在INSERT或UPDATE上,我们使用TRIGGER消除了撇号、重音、连字符和空格(在名称中)。显然,你的短语需要空格,但你可以把person's thing变成PERSONS THING,把thing-thing变成THINGTHING。
然后使用原始some_value字段显示数据,但始终在some_value_search上搜索。
这是在计算/计算/生成字段之前的几天。但是MySQL (截至5.7.6)有它们,您应该能够使用它们消除很多/大部分/所有触发代码。
col_name data_type [GENERATED ALWAYS] AS (expression)
[VIRTUAL | STORED] [NOT NULL | NULL]
[UNIQUE [KEY]] [[PRIMARY] KEY]
[COMMENT 'string']上面的表达式可以是(替换(替换(字段,'-',''),‘,’)以消除空格和连字符。但是,由于MySQL缺少[TRANSLATE()][3]函数,使得字符串所有大写的代码都很可怕(26个嵌套的REPLACEs!)如果你需要做什么复杂的事情,总是有TRIGGERs,但上面的解决方案是相当标准的今天!
发布于 2017-11-14 18:09:41
不是在标准SQL中,文本搜索功能没有那么灵活。
mySQL确实支持正则表达式,因此您可以这样执行搜索:https://dev.mysql.com/doc/refman/5.7/en/regexp.html
请注意,使用非标准特性会将您锁定到特定的数据库引擎。其他数据库可能支持regex搜索(例如https://www.postgresql.org/docs/10/static/functions-matching.html),但方式不同。
有什么特别的原因,为什么你想避免两个或更多的LIKEs与OR?
https://dba.stackexchange.com/questions/190902
复制相似问题