我需要在sql server中编写一个查询,它选择包含两个单词的行(至少/最多/完全)指定它们之间的单词...
我编写了这段代码,用于实现两者之间的确切字数:
SELECT simpledtext
FROM booktexts
WHERE simpledtext LIKE '%hello [^ ] [^ ] search%'
以及用于在其间实现最少字数的此代码:
SELECT simpledtext
FROM booktexts
WHERE simpledtext LIKE '%hello [^ ] [^ ] % search%'
但我不知道如何在t-sql代码之间编写最大单词...
另一个问题是可以在sql server 2012中使用全文搜索实现这些类型的查询吗?
答案 0 :(得分:1)
你喜欢的字符串只匹配单个字符。如果这是你需要的,你可以把这样的东西放在一起:
declare @str1 varchar(1024) = 'and hello w w w search how are you',
@str2 varchar(1024) = 'and hello w w search how are you',
@likeStr varchar(512),
@pos int,
@maxMatch int;
set @maxMatch = 2;
set @pos = 0;
set @likeStr = '%hello';
while (@pos < @maxMatch)
begin
set @likeStr += ' [^ ]';
set @pos += 1;
end
set @likeStr += ' search%';
select @likeStr, (case when @str1 like @likeStr then 1 else 0 end), (case when @str2 like @likeStr then 1 else 0 end)
如果这不是您需要的,并且您知道这些单词将包含多少个字符,则可以在循环中的类似字符串中使用[a-zA-Z]
。
然而,我预计这也不会是你所追求的。我的建议是放弃像字符串一样,然后转向更复杂的regular expressions
。
遗憾的是,您无法将System.dll直接加载到SQL Server 2008中(我认为这也适用于SQL Server 2012),因此您需要创建自定义.NET程序集并将其加载到数据库中。您应该在.NET代码中使用IsDeterministic
注释,并将自定义程序集加载到SQL Server with permission_set = safe
中。这应该确保您获得函数的并行性,并且可以在计算列等位置使用它。
SQL Server非常擅长运行.NET代码,即它可以非常好 高性能。在正则表达式中写下你需要的东西应该是 很容易。
对于全文搜索,contains()基本上是一个全文谓词,您必须在SQL Server中启用它才能使用它。 near()用于contains()谓词。我认为这对于你想要做的事情来说很笨重,无论是在支持的功能方面(它都会模糊匹配的话),以及你需要启用它(运行额外的Windows服务)。