只包含特定单词的SQL SELECT LIKE查询

3

I have this query:

SELECT * FROM mytable
WHERE column1 LIKE '%word1%'
AND column1 LIKE '%word2%'
AND column1 LIKE '%word3%'

我需要修改这个查询,以返回列1包含单词1、单词2和单词3且没有其他单词的记录!没有其他单词,只有这些单词。

例如:搜索samsung galaxy s3应该返回任何samsung s3 galaxy的组合,但不包括samsung galaxy s3 lte


请问您能详细说明一下这部分的意思吗?即“column1包含word1、word2和word3,且不包含其他任何内容!” - Hamed Al-Khabaz
现在我得到的结果是,Column1包含超过这3个单词,例如'word1 word2 word3 word4',而我需要匹配LIKE子句中指定的确切单词,但顺序可以任意。 - Mario
目前,您正在匹配单词的部分以及整个单词。您想匹配 'word1word3word2''word3 word2 word1' 吗? - Damien_The_Unbeliever
2
我不知道是不是只有我这样,但如果可能的话,我想要一个首选输出的示例,因为我仍然不理解。谢谢 :) - Hamed Al-Khabaz
3个回答

4

假设 column1 包含以空格分隔的单词,并且您只想匹配完整的单词,可以使用以下方式:

SELECT * FROM
  (select ' ' + REPLACE(column1,' ','  ') + ' ' as column1 from mytable) t
WHERE
   column1 like '% word1 %' AND
   column1 like '% word2 %' AND
   column1 like '% word3 %' AND
   REPLACE(REPLACE(REPLACE(column1,
      ' word1 ',''),
      ' word2 ',''),
      ' word3 ','') = ''

注意,该结构确实允许同一个单词出现多次。从问题中并不清楚是否允许这种情况。(Fiddle
如果将这些单词作为单独的行存储在与mytable相关的另一张表中,那么这将是一种更好的设计。然后我们可以使用更常规的SQL来满足这个查询。你的例子看起来像是某种标记示例。将每个标记作为单独的行存储在表中(如果需要,还可以记录顺序位置),这将把它转化为一个简单的关系除法问题。
计算单词在列中出现的次数的方法是表达式:
(LEN(column2) - LEN(REPLACE(column2,'word',''))/LEN('word')

但是如果不再进行更多的工作,这将再次回到匹配较大单词及其子序列本身的情况。


@MarioM - 我已更新查询,因为我意识到它没有执行“所有这些单词”的部分。 - Damien_The_Unbeliever
现在它的工作效果更好了,但它也返回了不包含word3的记录。 - Mario
@MarioM - 它不应该能够,因为第三个LIKE会是假的。 - Damien_The_Unbeliever
这是我的查询: SELECT * FROM MyTable WHERE Model like '%samsung%' AND Model like '%galaxy%' AND Model like '%s%' AND REPLACE(REPLACE(REPLACE(' ' + REPLACE(Model,' ',' ') + ' ', ' samsung ',''), ' galaxy ',''), ' s ','') = '' - Mario
@MarioM - 请查看重新编辑的内容 - 这是我在您原始问题的评论中指出的问题 - 您正在匹配单词内的子序列。 - Damien_The_Unbeliever
显示剩余5条评论

0

试一下

SELECT * FROM mytable
WHERE column1 LIKE 'word1'
AND column1 LIKE 'word2'
AND column1 LIKE 'word3'

1
没有通配符和不同的表达式,这些 LIKE 中没有两个可以同时为真,因此结果总是一个空集。 - Damien_The_Unbeliever
1
使用此查询,我可以获得仅包含一个单词的结果,但我需要结果返回包含任意顺序的所有3个单词的字符串。 - Mario
1
请查看我在问题中添加的示例。 - Mario

0

MySQL 中,您可以使用正则表达式作为

SELECT * FROM mytable
WHERE column1 regexp '^word[1-3]$';

postgres 中,您可以使用 'similar to' 关键字。
我认为 Oracle 也有 regexp

我不熟悉SQLite,但我认为它可以在MS SQL上运行,你可以用样本数据试一下。 - vidyadhar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接