2013-09-08 62 views
12

Mam procedurę składowania, którą planowałem użyć do wyszukiwania i uzyskać wszystkie wartości.LIKE i NULL w klauzuli WHERE w SQL

Scenariusz: Jeśli parametr przekazywana jest NULL powinien zwrócić wszystkie wartości z tabeli i jeśli parametr nie jest przekazywana NULL powinien powrócić wartości w zależności od stanu, który jest w podobnym.

// Zapytanie:

ALTER procedure [dbo].[usp_GetAllCustomerDetails] 
(
@Keyword nvarchar(20) = null 
) 
As 
Begin 

Select CustomerId,CustomerName,CustomerTypeName,CustomerCode,CategoryName,CustomerMobile,CustomerEmail,CustomerAddress,CustomerCity,CustomerState,Pincode 
from tblCustomerMaster CM 
inner join dbo.tblCustomerTypeMaster CTM on CTM.CustomerTypeId = CM.CustomerType 
inner join dbo.tblCategoryMaster CCM on CCM.CategoryId= CM.CustomerCategory 
where CustomerName like '%'[email protected]+'%' 

W powyższym zapytaniu zwraca żadnych wartości, kiedy wykonać ponieważ NULL przyjęto jako string przez SQL, więc co mam napisać w klauzuli where aby uzyskać pożądany wynik ?

+0

Prawdopodobny duplikat https://stackoverflow.com/questions/3924400/like-does-not-accept-null-value –

Odpowiedz

16

Można użyć warunku tak w was where klauzula

where @Keyword is null or CustomerName like '%' + @Keyword + '%' 
+0

Należy zachować ostrożność podczas używania zapytania w ten sposób, ponieważ wystąpią problemy z wydajnością. Gdy używasz @Keyword ma wartość null LUB coś, wszystkie indeksy nie są używane. Zapytanie będzie wolniejsze. Przeczytaj tutaj: http://stackoverflow.com/questions/2161573/how-to-optimize-the-use-of-the-lub-clause-when-used-with-parameters-sql-server –

+0

możesz lub nie może napotkasz problemy z wydajnością za pomocą zapytania. Istnieją pewne techniki, aby tego uniknąć, ale uważam, że to pytanie jest bardziej ogólne, gdzie składnia –

1

Wystarczy dodać SET @Keyword = coalesce(@Keyword,'') do postępowania tak:

ALTER procedure [dbo].[usp_GetAllCustomerDetails] 
(
@Keyword nvarchar(20) = null 
) 
As 
Begin 
SET @Keyword = coalesce(@Keyword,'') 

Select CustomerId,CustomerName,CustomerTypeName,CustomerCode,CategoryName,CustomerMobile,CustomerEmail,CustomerAddress,CustomerCity,CustomerState,Pincode 
from tblCustomerMaster CM 
inner join dbo.tblCustomerTypeMaster CTM on CTM.CustomerTypeId = CM.CustomerType 
inner join dbo.tblCategoryMaster CCM on CCM.CategoryId= CM.CustomerCategory 
where CustomerName like '%'[email protected]+'%' 
+0

nie zaleca tego. W efekcie otrzymasz zapytanie "gdzie Nazwa klienta jak" %% ", a to nie jest to samo co zwykły wybór wszystkich z tabeli. –

+0

@RomanPekar Spowoduje to wyłączenie wartości "NULL", prawda? czy będzie jakaś różnica? –

4

Chcę tylko zwrócić uwagę na inny sposób rozwiązywania ten problem. Problem polega na tym, że domyślną wartością dla @KeyWord jest NULL. Po zmianie domyślnego do '', wtedy problem zniknie:

ALTER procedure [dbo].[usp_GetAllCustomerDetails] 
(
@Keyword nvarchar(20) = '' 
) 

Wszelkie non-NULL nazwa klienta będzie wówczas jak „%%”.