2013-09-08 82 views
12

Tôi có một quy trình lưu trữ mà tôi đã lên kế hoạch để sử dụng cho tìm kiếm và nhận tất cả các giá trị.LIKE và NULL trong mệnh đề WHERE trong SQL

Kịch bản: Nếu tham số truyền vào là NULL nó sẽ trả về tất cả các giá trị của bảng và nếu tham số truyền vào không phải là NULL nó sẽ trả về các giá trị theo điều kiện mà là ở NHƯ.

// Truy vấn:

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]+'%' 

Trong các truy vấn trên nó sẽ trả về không có giá trị khi tôi thực hiện kể từ khi NULL được giả định như string bởi SQL, vì vậy những gì tôi nên viết trong mệnh đề where để có được những kết quả mong muốn ?

+0

Có thể sao chép https://stackoverflow.com/questions/3924400/like-does-not-accept-null-value –

Trả lời

16

Bạn có thể sử dụng điều kiện như thế này trong bạn where khoản

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

Hãy cẩn thận khi sử dụng truy vấn như vậy bởi vì bạn sẽ gặp vấn đề về hiệu suất. Khi bạn sử dụng @Keyword là null HOẶC một cái gì đó, tất cả các chỉ mục không được sử dụng. Truy vấn sẽ chậm hơn. Đọc tại đây: http://stackoverflow.com/questions/2161573/how-to-optimize-the-use-of-the-or-clause-when-used-with-parameters-sql-server –

+0

bạn có thể hoặc không thể chạy vào các vấn đề hiệu suất với truy vấn. Có một số kỹ thuật để tránh điều này, nhưng tôi tin rằng câu hỏi này là nhiều hơn về chung nơi cú pháp –

1

Bạn chỉ cần thêm SET @Keyword = coalesce(@Keyword,'') để làm thủ thuật như thế này:

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

không recomment để làm điều này. Bạn sẽ kết thúc với quere 'nơi CustomerName như '%%'' và điều này không giống như đồng bằng chọn tất cả từ bảng. –

+0

@RomanPekar Điều này sẽ chỉ loại trừ giá trị 'NULL', đúng không? hoặc sẽ có sự khác biệt nào nữa không? –

4

Tôi chỉ muốn chỉ ra một cách khác để giải quyết vấn đề này. Vấn đề là giá trị mặc định cho @KeyWordNULL. Nếu bạn thay đổi mặc định thành '' thì sự cố sẽ biến mất:

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

Mọi tên khách hàng không NULL sẽ giống như '%%'.

Các vấn đề liên quan