Một trong những công việc khá phổ biến trong các ứng dụng là biểu thị danh sách với chức năng tìm kiếm. Ví dụ, bạn có ứng dụng biểu thị danh sách khách hàng của công ty, và bạn cung cấp chức năng tìm kiếm cho các trường, tên, họ, nơi cư ngụ, giới tính v.v. Lúc đó, tùy vào sự lựa chọn của người dùng mà bạn phải chọn câu lệnh SQL cho thích hợp.
Về mặt kỹ thuật, giả thử bạn có bảng danh sách khách hàng (DSKH) - hoặc một câu truy vấn, tuơng đương VIEW. Câu lệnh của bạn đại khái là :
select * from DSKH;
Nếu người dùng chỉ muốn biết khách hàng ở Hải Phòng, câu lệnh của bạn đại khái là :
select * from DSKH where cuNgu = 'HaiPhong'
Nếu người dùng chỉ muốn biết khách hàng ở Hải Phòng và có họ Lê, câu lệnh của bạn :
select * from DSKH where cuNgu = 'HaiPhong' and ho = 'Le'
Tức, tùy vào yêu cầu của khách hàng mà bạn phải thay đổi câu lệnh cho thích hợp.
Bạn có thể sử dụng lô-gíc if else cho câu lệnh SQL ở ứng dụng hay STORED PROCEDURE. Nhưng cả 2 đều khá rắc rối. Đại khái như :
if @cuNgu = ''
select * from DSKH
else
select * from DSKH where cuNgu = @cuNgu
...
Bạn sẽ thấy ngay là mã sẽ trở nên dài dòng, đặc biệt với yêu cầu có hơn 3,4 biến tìm kiếm, vì bạn phải kết hợp các biến.
Cách tốt hơn là bạn sử dụng CASE trong mệnh đề WHERE.
Giả thử bạn có 3 thông số tìm kiếm là :
@cuNgu, @ho, @ten
Câu lệnh của bạn như sau:
select * from DSKH where
cuNgu = case when @cuNgu <> '' then @cuNgu else cuNgu end
and ho = case when @ho <> '' then @ho else ho end
and ten = case when @ten <> '' then @ten else ten end;
Câu lệnh đã trở nên ngắn gọn, rõ ràng và dễ hiểu. Đoạn mã đã tự giải thích tất cả
Dưới đây là toàn bộ mã cho bạn chạy thử.
Lưu Ý:
1 - Các câu lênh trên tôi sử dụng * cho ngắn gọn, trong thực tế bạn không nên sử dụng *, cứ viết thẳng các trường, tốn chút thời giờ nhưng tránh được nhiều phiền phức về sau. Tôi sẽ có bài viết về đề tài này.
2 - Bạn cũng có thể sử dụng câu truy vấn động trong STORED PROCEDURE, lúc đó bạn có thể sử dụng lô-gíc if else như ngoài ứng dụng, nhưng sử dụng câu truy vấn động trong STORED PROCEDURE có nhiều bất lợi khác. Tôi cũng sẽ có 1 bài viết về đề tài này.
Về mặt kỹ thuật, giả thử bạn có bảng danh sách khách hàng (DSKH) - hoặc một câu truy vấn, tuơng đương VIEW. Câu lệnh của bạn đại khái là :
select * from DSKH;
Nếu người dùng chỉ muốn biết khách hàng ở Hải Phòng, câu lệnh của bạn đại khái là :
select * from DSKH where cuNgu = 'HaiPhong'
Nếu người dùng chỉ muốn biết khách hàng ở Hải Phòng và có họ Lê, câu lệnh của bạn :
select * from DSKH where cuNgu = 'HaiPhong' and ho = 'Le'
Tức, tùy vào yêu cầu của khách hàng mà bạn phải thay đổi câu lệnh cho thích hợp.
Bạn có thể sử dụng lô-gíc if else cho câu lệnh SQL ở ứng dụng hay STORED PROCEDURE. Nhưng cả 2 đều khá rắc rối. Đại khái như :
if @cuNgu = ''
select * from DSKH
else
select * from DSKH where cuNgu = @cuNgu
...
Bạn sẽ thấy ngay là mã sẽ trở nên dài dòng, đặc biệt với yêu cầu có hơn 3,4 biến tìm kiếm, vì bạn phải kết hợp các biến.
Cách tốt hơn là bạn sử dụng CASE trong mệnh đề WHERE.
Giả thử bạn có 3 thông số tìm kiếm là :
@cuNgu, @ho, @ten
Câu lệnh của bạn như sau:
select * from DSKH where
cuNgu = case when @cuNgu <> '' then @cuNgu else cuNgu end
and ho = case when @ho <> '' then @ho else ho end
and ten = case when @ten <> '' then @ten else ten end;
Câu lệnh đã trở nên ngắn gọn, rõ ràng và dễ hiểu. Đoạn mã đã tự giải thích tất cả
Dưới đây là toàn bộ mã cho bạn chạy thử.
declare @DSKH table (maKH int identity(1,1), ho varchar(10), ten varchar(10), cuNgu varchar(20)); insert into @DSKH values ('Le','N','MinhHai'),('Le','A','HaiPhong'), ('Nguyen','H','Hue'),('Ly','V','HaiPhong'),('Le','A','CaMau'),('Duong','K','HaNoi'), ('Tran','B','HaNoi'),('Tran','C','HaiPhong'),('Le','B','DaNang'),('Phan','Y','NhaTrang'); -- bảng gốc select * from @DSKH; declare @ho varchar(10), @ten varchar(10), @cuNgu varchar(20); -- ban co the thay doi cac tham so set @ho = ''; set @ten = ''; set @cuNgu = 'HaiPhong'; select * from @DSKH where cuNgu = case when @cuNgu <> '' then @cuNgu else cuNgu end and ho = case when @ho <> '' then @ho else ho end and ten = case when @ten <> '' then @ten else ten end;
Lưu Ý:
1 - Các câu lênh trên tôi sử dụng * cho ngắn gọn, trong thực tế bạn không nên sử dụng *, cứ viết thẳng các trường, tốn chút thời giờ nhưng tránh được nhiều phiền phức về sau. Tôi sẽ có bài viết về đề tài này.
2 - Bạn cũng có thể sử dụng câu truy vấn động trong STORED PROCEDURE, lúc đó bạn có thể sử dụng lô-gíc if else như ngoài ứng dụng, nhưng sử dụng câu truy vấn động trong STORED PROCEDURE có nhiều bất lợi khác. Tôi cũng sẽ có 1 bài viết về đề tài này.
Không có nhận xét nào:
Đăng nhận xét