Как я могу использовать CONTAINS (), когда переменная иногда является пустой или пустой строкой? - PullRequest
1 голос
/ 26 марта 2012

У меня есть следующее условие 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 ИЛИ '""', если @GivenFirstName является нулевым внутри предложения where?

Спасибо, Томас

Ответы [ 3 ]

2 голосов
/ 26 марта 2012

COALESCE должен сделать это для вас, но вы должны иметь COALESCE(@GivenFirstName, '') (без двойных кавычек) для каждого параметра

Также я не думаю, что вам нужны все эти условия. CONTAINS должен сделать все для вас.

Вы можете сделать ГДЕ СОДЕРЖИТ (B.GivenName, '"" ИЛИ @GivenFirstName'), например

Также попробуйте прочитать о параметре INFLEXIONAL здесь

0 голосов
/ 27 марта 2012

Попробуйте это:

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

Изменение сопоставления на регистр-нечувствительный, акцент-нечувствительный сделает сравнение без акцентов с обеих сторон. IsNull превратит переменную в пустую строку, если она равна нулю, и если это пустая строка, то строка поиска будет «%%», что в основном означает «Начинается с чего-либо и заканчивается чем-либо», поэтому также будет возвращать Правда.

0 голосов
/ 26 марта 2012

спасибо за помощь всем. Первоначально я использовал это, чтобы при вводе в поиск символов с акцентом, таких как é, они по-прежнему возвращали результаты без акцентов и наоборот.

В итоге я просто использовал функцию акцентирования на полосах:

(((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) + '%' ))
...