2

我需要在 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 中使用全文搜索来实现这些类型的查询?

4

1 回答 1

2

你喜欢的字符串只会匹配单个字符的单词。如果这是你需要的,你可以像这样把一些东西放在一起:

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]在循环中的 like 字符串中使用。

但是,我希望这也不会是您所追求的。然后我的建议是放弃类似的字符串,并转向更复杂的regular expressions.

不幸的是,您不能将 System.dll 直接加载到 SQL Server 2008 中(我认为这也适用于 SQL Server 2012),因此您需要创建一个自定义的 .NET 程序集并将其加载到您的数据库中。您应该IsDeterministic在 .NET 代码中使用注释,并将自定义程序集加载到 SQL Serverwith permission_set = safe中。这应该确保您获得函数的并行性,并且可以在计算列等地方使用它。

SQL Server 非常擅长运行.NET 代码,即它可以非常高效。用正则表达式写出你需要的东西应该很容易。

至于全文搜索, contains() 基本上是一个全文谓词,您必须在 SQL Server 中启用它才能使用它。near() 在 contains() 谓词中使用。我认为这对于您想要做的事情来说是庞大的,无论是就支持的功能(它为模糊匹配做词的变化),以及您需要启用它(运行额外的 Windows 服务)而言。

于 2013-02-23T11:55:26.817 回答