一尘不染

SQL SELECT LIKE仅包含特定单词

sql

我有这个查询:

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


阅读 204

收藏
2021-03-17

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

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


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


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

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

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

2021-03-17