当变量有时为空或空字符串时,如何使用 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。