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

时间:2014-03-11 13:57:27

标签: sql sql-server tsql full-text-search contains

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

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

  1. heuvel*提供所有预期的行。
  2. *给出零行,而论坛上的其他线程则表示它将提供所有行
  3. street = isnull(@street, street)提供所有行
  4. 知道以上所有内容我认为这个查询会起作用。确实如此,但它非常慢。

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

    Declare @Street nvarchar(50)= '"heuvel*"'
    Declare @InnerStreet nvarchar(50) =  '"'+ isnull(@Street, '')  +'*"';
    
    SELECT *
    FROM Address
    WHERE street = isnull(@street, street) or CONTAINS(street, @InnerStreet) 
    

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

1 个答案:

答案 0 :(得分:0)

试试这个。 @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