SQL SELECT LIKE仅包含特定单词

时间:2013-01-12 06:52:38

标签: sql select sql-like

我有这个问题:

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的任意组合

3 个答案:

答案 0 :(得分: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')

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

答案 1 :(得分:0)

试试这个

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

答案 2 :(得分:0)

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

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

,您可以使用“similar to”关键字

我认为oracle也有regexp