Ben*_*ada 5 t-sql sql-server full-text-search containstable sql-server-2008-r2
我很惊讶地发现,它们都不支持CONTAINS或CONTAINSTABLE似乎不支持以下语法,您在其中为最后一个Search Condition参数传递了列名。
SELECT *
FROM dbo.Articles AS a
WHERE EXISTS
(
SELECT *
FROM dbo.Terms AS t
INNER JOIN CONTAINSTABLE(dbo.Articles, (ArticleBody), t.FulltextTerm)
AS ct ON ct.[Key] = a.ArticleId
)
Run Code Online (Sandbox Code Playgroud)
上面的查询返回“ t附近的语法不正确”错误消息。
该Terms表包含带有一行的多行FulltextTerm,并且如果FulltextTermArticleBody 中包含这些值中的任何一个,则该值应为匹配项,以便选择特定的Article。这就是我要实现的目标。
CONTAINS并且CONTAINSTABLE似乎仅支持字符串文字或变量作为“搜索条件”参数,这是非常有限的。如果那是唯一的选择,则它需要更多的代码,并且如果我需要Terms使用游标或循环遍历表,肯定会慢很多。
我是否在这里缺少技巧或有人可以建议的任何解决方法-最好是基于集合的解决方案,即避免循环。
将所有术语合并到一个变量中,然后使用 CONTAINSTABLE 怎么样,如下所示:-
declare @term as table(
FulltextTerm nvarchar(60)
)
insert into @term values ('light NEAR aluminum')
insert into @term values ('lightweight NEAR aluminum')
Declare @FulltextTerm nvarchar(max)=''
select @FulltextTerm=@FulltextTerm+' OR ('+FulltextTerm+')' from @term
set @FulltextTerm=SUBSTRING(@FulltextTerm,5,99999)
-- @FulltextTerm will have the below value:-
-- (light NEAR aluminum) OR (lightweight NEAR aluminum)
SELECT *
FROM dbo.Articles AS a
INNER JOIN
CONTAINSTABLE (dbo.Articles,ArticleBody,@FulltextTerm) AS ct
ON ct.[Key] = a.ArticleId
Run Code Online (Sandbox Code Playgroud)
当然,在您的情况下,您不需要表变量@term,您可以将其替换为您的 Term 表,但我仅在这里使用它来展示这个想法。
我相信这可能比循环更好。
注意:我不知道您的数据库版本,但如果您可以使用 STRING_AGG 函数,您甚至可以使用下面的数据库版本
select @FulltextTerm=STRING_AGG('('+FulltextTerm+')',' OR ') from @term
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
940 次 |
| 最近记录: |