SQL - 搜索没有空格的短语

时间:2016-07-20 18:40:19

标签: mysql sql regex

如果短语包含MySQL中的确切单词,您将如何设法搜索?

f.e。如果列phrase有短语:     '您好,我的名字是Jack' 我想搜索它是否包含单词:' name'和杰克' - 很简单:

SELECT `phrase` FROM column WHERE `phrase` RLIKE '[[:<:]]name[[:>:]]' 
AND `phrase` RLIKE '[[:<:]]Jack[[:>:]]'

但如果短语如下,你将如何设法做到这一点:     &#39; HelloMyNameIsJack&#39; ?? (没有空格)

编辑:我不能使用&#39; LIKE&#39;因为如果会有另一个短语:&#39; HelloMyXyznamexyzIsJack&#39; - 它会找到我整个短语 - 我不想要 - 我只是想找到单词

编辑2:很难解释,但让我尝试一下:我想找一个包含给定单词的短语但是作为一个单词 - 如果我发出单词&#39; name&#39;和杰克&#39; - 我不想找到f.e. &#39; HelloMyNamesIsJacky&#39; - 问题是如何让sql知道&#39; HelloMyNamesIsJacky&#39;是单词(因为它们之间没有空格)

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

根据您的修改,听起来这可以使用concatlike一起使用:

select phrase
from yourtable
where concat(' ',phrase,' ') like '% name %' and 
      concat(' ',phrase,' ') like '% Jack %' 

注意 - 如果您的句子在一段时间内结束,这仍然可能会失败。你必须为这种情况编码......

答案 1 :(得分:1)

要查找类似示例的单词,您可以尝试使用空格前置大写字母,然后运行现有的正则表达式。这与从您的数据中解析英语单词不同,然而,这将充满技术挑战。不过,它可能会对你起到快速的作用。

根据你的例子,我在这里写了几封信给你一个想法(但你想添加A,B,C ......):

select Phrase
from MyTable
where replace(replace(replace(Phrase, 'I', ' I'), 'J', ' J'), 'N', ' N') rlike '[[:<:]]name[[:>:]]'
  and replace(replace(replace(Phrase, 'I', ' I'), 'J', ' J'), 'N', ' N') rlike '[[:<:]]Jack[[:>:]]'

给出如下数据:

'Hello my name is Jack'
'HelloMyNameIsJack'
'HelloMyXyznamexyzIsJack'
'HelloMyNamesIsJacky'
'HelloMyNameIsJacky'
'HelloJackIsMyName'

您的结果将是:

'Hello my name is Jack'
'HelloMyNameIsJack'
'HelloJackIsMyName'

答案 2 :(得分:0)

如果您仍然使用LIKE运算符

,该怎么办?
SELECT `phrase` 
FROM `column`
WHERE `phrase` LIKE '%name%' 
AND `phrase` LIKE '%Jack'

在这种情况下,您似乎应该选择Full-Text Search