3

我有这个查询:

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

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

示例:搜索应该返回但 NOTsamsung galaxy s3的任意组合samsung s3 galaxysamsung galaxy s3 lte

4

3 回答 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 ','') = ''

请注意,这种结构确实允许同一个词多次出现。从是否应该允许的问题中不清楚。(小提琴


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


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

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

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

于 2013-01-12T07:01:11.733 回答
0

试试这个

SELECT * FROM mytable
WHERE column1 LIKE 'word1'
AND column1 LIKE 'word2'
AND column1 LIKE 'word3'
于 2013-01-12T06:56:41.213 回答
0

MySQL你可以使用正则表达式作为

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

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

我认为甲骨文也有regexp

于 2013-01-12T07:15:48.220 回答