仅包含特定单词的 SQL SELECT LIKE

Posted

技术标签:

【中文标题】仅包含特定单词的 SQL SELECT LIKE【英文标题】:SQL SELECT LIKE containing only specific words 【发布时间】:2012-12-26 19:06:54 【问题描述】:

我有这个问题:

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

我需要修改此查询以返回 column1 包含 word1 word2 和 word3 的记录,仅此而已!没有别的词,只有这些词。

示例:搜索samsung galaxy s3 应该返回samsung s3 galaxy 的任意组合,但不是samsung galaxy s3 lte

【问题讨论】:

这部分能不能详细点"which column1 contains word1 word2 and word3 and nothing else!" 现在我得到了 Column1 包含超过这 3 个单词的结果,例如“word1 word2 word3 word4”,我需要与 LIKE 子句中指定的确切单词匹配的结果,但顺序不限。 目前,您正在匹配部分单词以及整个单词。你想匹配'word1word3word2''word3 word2 word1'吗? 我不知道是不是只有我一个人,但如果可能的话,我想要一个示例,说明首选输出应该是什么,因为我仍然不明白。谢谢:) 【参考方案1】:

假设 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 ','') = ''

请注意,这种结构确实允许 same 单词多次出现。从是否应该允许的问题中不清楚。 (Fiddle)


如果这些词作为单独的行存储在与mytable 相关的单独表中,那将是一个更好的设计。然后我们可以使用更普通的 SQL 来满足这个查询。您的示例看起来像是某种标记示例。有一个表格将每个标签存储为单独的行(如果需要,还记录一个序数位置)会将这变成一个简单的关系除法问题。


一种计算一个词在一列中出现多少次的方法是表达式:

(LEN(column2) - LEN(REPLACE(column2,'word',''))/LEN('word')

但这将再次恢复为匹配较大单词的子序列以及单词本身,而无需更多工作。

【讨论】:

此查询返回的结果只包含 word1 和 word2 @MarioM - 我更新了查询,因为我意识到它没有做“所有这些词”部分。 现在效果更好了,但它也会返回不包含 word3 的记录 @MarioM - 它不应该,因为第三个LIKE 会是假的。 这是我的查询:SELECT * FROM MyTable WHERE Model like '%samsung%' AND Model like '%galaxy%' AND Model like '%s%' AND REPLACE(REPLACE(REPLACE(' ' + REPLACE(型号,'','') +'','三星',''),'银河',''),'s','') = ''【参考方案2】:

试试这个

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

【讨论】:

没有通配符和不同的表达式,LIKEs 中没有两个是真的,所以结果总是一个空集。 通过这个查询,我得到的结果只包含一个单词,我需要结果以任何顺序返回一个包含所有 3 个单词的字符串 请看我添加到问题中的例子【参考方案3】:

mysql你可以使用正则表达式

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

postgres你可以使用'similar to'关键字

我认为 oracle 也有 regexp

【讨论】:

我不知道 SQLite,但我认为它可以在 MS SQL 上运行,您只需尝试使用示例数据

以上是关于仅包含特定单词的 SQL SELECT LIKE的主要内容,如果未能解决你的问题,请参考以下文章

SQL SELECT 仅包含单词的字段

如何选择包含特定单词的 postgreSQL 行

如何仅在 LIKE 查询 Laravel 中找到整个单词?

Laravel 在 2 列上搜索特定的包含单词

SQL检查文本是否包含单词

在 T-SQl 中使用 like 搜索由未知数量的空格分隔的单词