我有这个问题:
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
最佳答案
假设 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')
但这将再次恢复到匹配较大单词的子序列以及单词本身,而无需更多工作。
关于SQL SELECT LIKE 只包含特定的词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14291060/