我有这个问题:
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
的任意组合
答案 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