我有以下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.
我尝试在
中包装@GivenFirstNameCOALESCE(@GivenFirstName, '""')
但它也不起作用。
如果在where子句中@GivenFirstName为空,我可以使用@GivenFirstName OR'“”'吗?
谢谢, 托马斯
答案 0 :(得分:2)
COALESCE
应该为您做到这一点,但每个参数都应该有COALESCE(@GivenFirstName, '')
(不带双引号)
我也不认为你需要所有这些条件。 CONTAINS
应该为您做好一切。
你可以做WHERE CONTAINS(B.GivenName,'“或”@GivenFirstName“)例如
另外,请尝试阅读INFLEXIONAL参数here
答案 1 :(得分:0)
感谢大家的帮助。我最初使用这个,所以当é等重音字符输入到搜索中时,它们仍会返回没有重音的结果,反之亦然。
我最终只使用了条带重音函数,如下所示:
(((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) + '%' ))
答案 2 :(得分:0)
试试这个:
...
WHERE B.GivenName COLLATE LATIN1_GENERAL_CI_AI LIKE
'%' + ISNULL(@GivenFirstName, '') COLLATE LATIN1_GENERAL_CI_AI + '%'
将排序规则更改为不区分大小写,不区分重音将进行比较而不使用双方的重音。如果变量为空,IsNull会将变量变为空字符串,如果它是空字符串,则搜索字符串将为'%%',这基本上意味着'从任何事物开始并以任何结束',因此也将返回真。