SQL 在字符串中搜索多个单词,知道其中一些单词可能不存在



>我有一个满是字符串的表,我想搜索一堆单词,并检索至少包含其中 1 个单词的字符串,例如:

我想搜索的词是"猫"、"狗"和"蝙蝠"。

表中的一些字符串是:

1  "hi cat, I like dogs and owls"
2  "hi cat"
3  "hey bat, cat, owl, dog"
4  "orange is sweet"

此查询应返回 1、2 和 3,而不是 4。

我知道加入可能是一个解决方案,但我不知道如何使用超过 6 个单词来实现它。

编辑: 有没有办法按最大的匹配项对结果进行排序?这意味着我希望第一个结果是包含大多数键(如果有的话(的结果,这就是我忽略 LIKE-OR 组合的原因。

您可以使用PATINDEX函数,wchich 以字符串形式返回匹配项的索引。如果没有匹配项,则返回 0,因此请尝试以下脚本:

declare @x table(
ID int identity(1,1),
name varchar(30)
)
insert into @x values ('hi cat, I like dogs and owls'), ('hi cat'),('hey bat, cat, owl, dog'),('orange is sweet')
select ID from @x where PATINDEX('%cat%', name) + PATINDEX('%dog%', name) + PATINDEX('%bat%', name)  > 0

另一种解决方案是使用LIKE运算符:

select ID from @x where name LIKE '%cat%' or name LIKE '%dog%' or name LIKE '%bat%'

回答您的编辑,第一种方法是最好的。您可以通过以下查询获得所需的结果(不幸的是,它变得有点复杂(:

select ID from @x 
where PATINDEX('%cat%', name) + PATINDEX('%dog%', name) + PATINDEX('%bat%', name)  > 0
order by case PATINDEX('%cat%', name) when 0 then 0 else 1 end + 
case PATINDEX('%dog%', name) when 0 then 0 else 1 end +
case PATINDEX('%bat%', name) when 0 then 0 else 1 end
desc
DROP table #TEMP
create table #Temp
(
string Varchar(50), 
)
insert into #Temp (string) values
('hi cat, I like dogs and owls'),
('hi cat'),
('orange is sweet'),
('hey bat, cat, owl, dog')

SELECT * FROM #Temp WHERE string LIKE '%cat%'

相关内容

最新更新