首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回包含或不包含标点符号的结果

问返回包含或不包含标点符号的结果
EN

Database Administration用户
提问于 2017-11-14 17:39:31
回答 2查看 2.9K关注 0票数 2

MySQL中是否有一种方法可以使用包含或不包含标点符号(如撇号和连字符)的LIKE语句返回结果?

例如,如果我有以下查询之一:

代码语言:javascript
复制
SELECT * FROM some_table WHERE some_value LIKE "%this-thing%";

或

代码语言:javascript
复制
SELECT * FROM some_table WHERE some_value LIKE "%person's thing%"

是否有一种方法可以获得与下面的查询相同的结果,但使用一个LIKE子句?

代码语言:javascript
复制
SELECT * FROM some_table WHERE (some_value LIKE "%this-thing%") OR (some_value LIKE "%this thing%");

或

代码语言:javascript
复制
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数字字符?例如,如果列值中有“某某物&其他东西”,那么它将作为“某样东西-其他东西”返回?因此,查询应该类似于:

代码语言:javascript
复制
SELECT * FROM table WHERE magic_function(column_name) LIKE '%words%'

编辑x2

目前,我已经通过将REPLACE()链接在一起,并在进行比较之前将列值中的所有特殊字符替换为"“来解决这个问题。被比较的值也被去掉了所有的特殊字符。

EN

回答 2

Database Administration用户

回答已采纳

发布于 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)有它们,您应该能够使用它们消除很多/大部分/所有触发代码。

代码语言:javascript
复制
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,但上面的解决方案是相当标准的今天!

票数 1
EN

Database Administration用户

发布于 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?

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/190902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档