gpt4 book ai didi

sql-server - 如何使用 CONTAINSTABLE 中的列名作为搜索条件?

转载 作者:行者123 更新时间:2023-12-02 23:26:51 25 4
gpt4 key购买 nike

我惊讶地发现 CONTAINSCONTAINSTABLE 似乎都不支持如下所示的语法,您在其中为最后一个搜索条件参数传递列名称。

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
)

上面的查询返回“'t'附近的语法不正确”错误消息。

Terms 表包含多行和一个 FulltextTerm 列,如果这些 FulltextTerm 值中的任何一个位于 ArticleBody 中,则它应该是匹配,以便选择特定的文章。这就是我想要实现的目标。

CONTAINSCONTAINSTABLE 似乎仅支持搜索条件参数的字符串文字或变量,这是非常有限的。如果这是唯一的选择,则需要更多代码,并且如果我需要使用游标或循环遍历 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

当然,在你的情况下,你不需要表变量@term,你可以用你的Term表替换它,但我在这里只是用它来展示这个想法。

我相信这可能比循环更好。

注意:我不知道您的数据库版本,但如果您可以使用 STRING_AGG 函数,您甚至可以使用下面的数据库

select @FulltextTerm=STRING_AGG('('+FulltextTerm+')',' OR ') from @term

关于sql-server - 如何使用 CONTAINSTABLE 中的列名作为搜索条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25169509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com