当变量有时为空或空字符串时,如何使用 CONTAINS()?

Posted

技术标签:

【中文标题】当变量有时为空或空字符串时,如何使用 CONTAINS()?【英文标题】:How can I use CONTAINS() when the variable is sometimes null or empty string? 【发布时间】: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 '""'?

谢谢, 托马斯

【问题讨论】:

您缺少一个左括号,但我认为这只是一个错字? 【参考方案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,如果是空字符串,那么搜索字符串会是'%%',基本意思是'以任何东西开始,以任何东西结束',所以也会返回没错。

【讨论】:

以上是关于当变量有时为空或空字符串时,如何使用 CONTAINS()?的主要内容,如果未能解决你的问题,请参考以下文章

Python Django 模板和测试变量是不是为空或空字符串

javascript 判断变量 是否为空null,undefined, 空数组,空对象(空Object),字符串是否为空或全由空白字符组成,数字是否为0,布尔是否为false。

Node.js 请求下载文件有时为空或不存在

在 XSLT 中检查字符串是不是为空或空

Excel VBA 判断工作表是否为空或被使用过(比如设置过框线)

在 joi 和 express-validation 中允许字符串为空或空