带有可为空参数的sql全文搜索

Posted

技术标签:

【中文标题】带有可为空参数的sql全文搜索【英文标题】:sql full text search with nullable parameter 【发布时间】:2014-04-15 04:38:13 【问题描述】:

我们希望使用全文搜索,但在我们的过程中保持传入参数可以为空。在此示例中,@Street 可以具有类似 Heuvel 的值,也可以是 NULL

在查询中解决这个问题是行不通的。

    heuvel* 给出了所有预期的行。 * 给出零行,而论坛上的其他线程说它将给出所有行 street = isnull(@street, street) 给出所有行

了解以上所有内容后,我认为此查询会起作用。可以,但速度很慢。

当我单独执行 or 子句时,查询速度很快。

Declare @Street nvarchar(50)= '"heuvel*"'
Declare @InnerStreet nvarchar(50) =  '"'+ isnull(@Street, '')  +'*"';

SELECT *
FROM Address
WHERE street = isnull(@street, street) or CONTAINS(street, @InnerStreet) 

现在的问题是,如何使用全文搜索和可空参数?

【问题讨论】:

除了@Street,你的存储过程还有多少可以为空的参数? 原始查询中有多个可为空的参数。此线程中的查询是一个简化版本。 【参考方案1】:

试试这个。 @street 为 NULL 或有值。

declare @streetWildcard nvarchar(50) = '"' + @street + '*"'
SELECT *
FROM Address
WHERE (@street is NULL) or CONTAINS(street, @streetWildcard)

如果性能仍然很差,那么执行计划可能不会短路 WHERE 条件。在这种情况下,请改用此方法。

if (@street is NULL) begin
    SELECT *
    FROM Address
end
else begin
    declare @streetWildcard nvarchar(50) = '"' + @street + '*"'
    SELECT *
    FROM Address
    WHERE CONTAINS(street, @streetWildcard)
end

【讨论】:

我在 "CONTAINS(street, '"' + street + '"')" 中的 + 上收到语法错误。当我将 '"' + street + '"' 放在新声明的参数中时,查询运行但非常慢。 我更新了我的答案以修复语法错误并解决性能问题。如果地址表有很多行和列,则考虑只选择必要的列,并可能限制或分页结果。 带有 if else 的部分有效,但让我的查询像这样已经消失了很长。就像我提到的那样,完整的查询有多个可为空的参数。如果我需要为 if else 函数中的每个可空参数编写一个查询,它将不再可读或可维护。

以上是关于带有可为空参数的sql全文搜索的主要内容,如果未能解决你的问题,请参考以下文章

带有布尔全文搜索格式问题的spring jdbc准备语句

SQL Server 中全文搜索的奇怪行为

在sql server中参数化全文查询

全文索引和搜索速度

SQL Server中的全文搜索

带有全文搜索和项目的 Mongoose 子字段聚合