仅包含特定单词的 SQL SELECT LIKE
Posted
技术标签:
【中文标题】仅包含特定单词的 SQL SELECT LIKE【英文标题】:SQL SELECT LIKE containing only specific words 【发布时间】:2012-12-26 19:06:54 【问题描述】:我有这个问题:
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
【问题讨论】:
这部分能不能详细点"which column1 contains word1 word2 and word3 and nothing else!"
现在我得到了 Column1 包含超过这 3 个单词的结果,例如“word1 word2 word3 word4”,我需要与 LIKE 子句中指定的确切单词匹配的结果,但顺序不限。
目前,您正在匹配部分单词以及整个单词。你想匹配'word1word3word2'
和'word3 word2 word1'
吗?
我不知道是不是只有我一个人,但如果可能的话,我想要一个示例,说明首选输出应该是什么,因为我仍然不明白。谢谢:)
【参考方案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 ','') = ''
请注意,这种结构确实允许 same 单词多次出现。从是否应该允许的问题中不清楚。 (Fiddle)
如果这些词作为单独的行存储在与mytable
相关的单独表中,那将是一个更好的设计。然后我们可以使用更普通的 SQL 来满足这个查询。您的示例看起来像是某种标记示例。有一个表格将每个标签存储为单独的行(如果需要,还记录一个序数位置)会将这变成一个简单的关系除法问题。
一种计算一个词在一列中出现多少次的方法是表达式:
(LEN(column2) - LEN(REPLACE(column2,'word',''))/LEN('word')
但这将再次恢复为匹配较大单词的子序列以及单词本身,而无需更多工作。
【讨论】:
此查询返回的结果只包含 word1 和 word2 @MarioM - 我更新了查询,因为我意识到它没有做“所有这些词”部分。 现在效果更好了,但它也会返回不包含 word3 的记录 @MarioM - 它不应该,因为第三个LIKE
会是假的。
这是我的查询:SELECT * FROM MyTable WHERE Model like '%samsung%' AND Model like '%galaxy%' AND Model like '%s%' AND REPLACE(REPLACE(REPLACE(' ' + REPLACE(型号,'','') +'','三星',''),'银河',''),'s','') = ''【参考方案2】:
试试这个
SELECT * FROM mytable
WHERE column1 LIKE 'word1'
AND column1 LIKE 'word2'
AND column1 LIKE 'word3'
【讨论】:
没有通配符和不同的表达式,LIKE
s 中没有两个是真的,所以结果总是一个空集。
通过这个查询,我得到的结果只包含一个单词,我需要结果以任何顺序返回一个包含所有 3 个单词的字符串
请看我添加到问题中的例子【参考方案3】:
在mysql
你可以使用正则表达式
SELECT * FROM mytable
WHERE column1 regexp '^word[1-3]$';
在postgres
你可以使用'similar to
'关键字
我认为 oracle 也有 regexp
【讨论】:
我不知道 SQLite,但我认为它可以在 MS SQL 上运行,您只需尝试使用示例数据以上是关于仅包含特定单词的 SQL SELECT LIKE的主要内容,如果未能解决你的问题,请参考以下文章