【问题标题】:How can I use CONTAINS() when the variable is sometimes null or empty string?当变量有时为空或空字符串时,如何使用 CONTAINS()?
【发布时间】:2012-04-10 02:15:18
【问题描述】:

我有以下 where 子句:

B.GivenName=@GivenFirstName)  
or ((@GivenFirstName = '""') 
or  (@GivenFirstName is null)) 
or (B.GivenName like +'%'+ @GivenFirstName) 
or (B.GivenName like  @GivenFirstName + '%' )  
or (B.GivenName like + '%'+ @GivenFirstName + '%' ) 
or (CONTAINS(B.GivenName, @GivenFirstName,LANGUAGE 'german'))

如果没有在搜索中输入名字,我会收到错误:

Msg 7645, Level 15, State 2, Procedure Search_test, Line 179
Null or empty full-text predicate.

我尝试将 @GivenFirstName 包装在

COALESCE(@GivenFirstName, '""') 

但它也不起作用。

如果 @GivenFirstName 在 where 子句中为空,我是否可以使用 @GivenFirstName OR '""'?

谢谢, 托马斯

【问题讨论】:

  • 您缺少一个左括号,但我认为这只是一个错字?

标签: asp.net sql-server full-text-search contains


【解决方案1】:

COALESCE 应该为您执行此操作,但您应该在每个参数上使用 COALESCE(@GivenFirstName, '')(不带双引号)

另外我认为你不需要所有这些条件。 CONTAINS 应该为您做所有事情。

例如,您可以执行 WHERE CONTAINS(B.GivenName, ' "" OR @GivenFirstName ')

另外,请尝试阅读 INFLEXIONAL 参数here

【讨论】:

  • 是的,我认为它相当广泛。这是一个 500 行的程序,我从 .... 一家来自印度的廉价公司接手 .... 所以我现在正试图尽可能少地改变。
  • 你不能检查proc开头的参数,如果它是null,让它成为一个空字符串?
  • 包含大幅增加查询时间是否正常?
  • 我已经删除了所有额外的条件并将其更改为: (((CONTAINS(B.GivenName, ' "" OR @GivenFirstName ',LANGUAGE 'german'))) 并且它正在接管3分钟查询。
  • 恰恰相反。全文搜索更快,但在这种情况下,您正在运行 CONTAINS 和其他几个 LIKE,因此它会更慢。如果将 CONTAINS (B.GivenName, "Test" ') 与 b.GivenName 类似 '%Test%' 进行比较,包含会更快
【解决方案2】:

感谢大家的帮助。我最初是这样使用的,这样当在搜索中输入像 é 这样的重音字符时,它们仍然会返回没有重音的结果,反之亦然..

我最终只使用了像这样的带重音函数:

(((dbo.fn_StripAccents(B.GivenName)=dbo.fn_StripAccents(@GivenFirstName))  
or ((@GivenFirstName = '""') 
or (@GivenFirstName is null)) 
or (dbo.fn_StripAccents(B.GivenName) like +'%'+ dbo.fn_StripAccents(@GivenFirstName)) 
or (dbo.fn_StripAccents(B.GivenName) like  dbo.fn_StripAccents(@GivenFirstName) + '%' )     
or (dbo.fn_StripAccents(B.GivenName) like + '%'+ dbo.fn_StripAccents(@GivenFirstName) + '%' ))

【讨论】:

    【解决方案3】:

    试试这个:

    ...
    WHERE B.GivenName COLLATE LATIN1_GENERAL_CI_AI LIKE 
       '%' + ISNULL(@GivenFirstName, '') COLLATE LATIN1_GENERAL_CI_AI + '%'
    

    将排序规则更改为不区分大小写、不区分重音将在没有两边的重音的情况下进行比较。 IsNull 会把变量变成空字符串,如果是null,如果是空字符串,那么搜索字符串会是'%%',基本意思是'以任何东西开始,以任何东西结束',所以也会返回没错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 2020-01-31
      • 1970-01-01
      • 2015-09-07
      • 2012-02-01
      相关资源
      最近更新 更多