我有这个查询:
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
samsung galaxy s3
samsung s3 galaxy
samsung galaxy s3 lte
假设 其中column1包含用空格分隔的单词,并且您只想匹配 整个 单词,则类似于:
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来满足此查询。您的示例看起来像是某种标记示例。拥有一个将每个标签存储为单独行的表(如果需要,还记录了序数位置)会将其变成一个简单的关系划分问题。
mytable
计算一个单词在一个列中出现多少次的一种方式是表达式:
(LEN(column2) - LEN(REPLACE(column2,'word',''))/LEN('word')
但这又会回到较大单词的匹配子序列以及单词本身,而无需进行更多工作。