30/09/2018, 18:27

Cách truy vấn SQL Server để tìm kiếm nhiều thông tin


Em có cái giao diện tìm kiếm của em như hình…khi người dùng chọn các tiêu chí tìm kiếm thì sẽ tìm kiếm theo các tiêu chí mà người dùng đã chọn và hiển thị thông tin lên bảng…Mấy anh chị cho em hỏi là mình phải viết câu truy vấn như thế nào để bao quát được tất cả các lựa chọn của người dùng ạ…Em dùng SQL Server ạ (Ví dụ,người dùng có thể chọn tìm kiếm giới tính là Nam,mã ngoại ngữ là AnhVan…hoặc mã nghề nghiệp là BacSy và Mã ngoại ngữ là AnhVan…v…v.) Anh chị nào biết chỉ em với…em cảm ơn nhiều ạ

vũ xuân quân viết 20:34 ngày 30/09/2018

em viết câu sql bằng cách cộng chuỗi.
Em kiểm tra điều kiện tìm kiếm có nhập thì em cộng vào.

viết 20:33 ngày 30/09/2018

Mình cộng tất cả các chuổi mà người dùng nhập lại…rồi mình truy vấn như thế nào anh???

Le Hoai viết 20:30 ngày 30/09/2018

Em dùng SQL Server ạ (Ví dụ,người dùng có thể chọn tìm kiếm giới tính là Nam,mã ngoại ngữ là AnhVan…hoặc mã nghề nghiệp là BacSy và Mã ngoại ngữ là AnhVan…v…v.) Anh chị nào biết chỉ em với…em cảm ơn nhiều ạ

Giả sử bạn cần tìm kiếm thông tin nhân viên theo các tiêu chí : Họ tên, tuổi, số điện thoại ( chỉ giả sử 3 cái thôi )
Khi đó câu SQL của bạn sẽ có dạng này

 select * from staff where ( fullname = @fullname or @fullname = '' ) and  ( age= @age or @age= '' ) and  ( phone= @phone or @phone= '' )

Như vậy thì khi người dùng ko nhập gì nó sẽ search ra hết, còn nếu nhập vào thì nó sẽ fill dữ liệu

vũ xuân quân viết 20:28 ngày 30/09/2018

select * from staff where ( fullname = @fullname or @fullname = ‘’ ) and ( age= @ag
or @age= ‘’ ) and ( phone= @phone or @phone= ‘’ )

không nên viết câu sql kiểu này. Thêm điều kiện or vào làm mất thời gian so sánh trong lúc chạy truy vấn.

Em coi link này
http://www.tutorialspoint.com/sqlite/sqlite_java.htm
Phần select.

viết 20:35 ngày 30/09/2018

Em làm như Anh nói…Mà nó không ra gì luôn…Em nghĩ câu truy vấn có vấn đề vì một thuộc tính khi mình không chọn để tìm kiếm thì giá trị của nó trên CSDL không phải là NULL
Câu truy vấn của em
sqlQuery = “Select MaDangVien,HoTenDangVien,NgaySinh,GioiTinh,MaDanToc,MaHocVi,MaNgheNghiep,ChuyenMonNghiepVu,MaNgoaiNgu from DangVien where (MaDangVien = '”+maDangVien1+"’ or MaDangVien = ‘’) and (HoTenDangVien = ‘"+hoVaTen1+"’ or HoTenDangVien = ‘’) and (NgaySinh = ‘"+ngaySinh1+"’ or NgaySinh = ‘’) and (GioiTinh = ‘"+gioiTinh1+"’ or GioiTinh = ‘’) and (MaDanToc = ‘"+maDanToc1+"’ or MaDanToc = ‘’) and (MaHocVi = ‘"+maHocVi1+"’ or MaHocVi = ‘’) and (MaNgheNghiep = ‘"+maNgheNghiep1+"’ or MaNgheNghiep = ‘’) and (ChuyenMonNghiepVu = ‘"+chuyenMonNghiepVu1+"’ or ChuyenMonNghiepVu = ‘’) and (MaNgoaiNgu = ‘"+maNgoaiNgu1+"’ or MaNgoaiNgu = ‘’)";

Phạm Hoàng Tuấn viết 20:43 ngày 30/09/2018

Bạn nên check input người dùng có nhập giá trị của 1 thuộc tính vào hay không trước khi đưa thuộc tính đó vào câu truy vấn.
Ví dụ mình thường xài : (Mã giả)

string SelectQuery= "Select *  ";
string FromQuery= "from DangVien where " ;
if(txtMaDangVien.Text !="")
      FromQuery=FromQuery + "MaDaVien like " + txtMaDangVien.Text;

if(txtHoVaTen.Text !="")
       FromQuery= FromQuery + "And" + "HoVaTen like " + txtHoVaTen.Text;


string Query=SelectQuery+FromQuery;
Le Hoai viết 20:36 ngày 30/09/2018

@MangoaiNgu = ‘’ chứ ko phải là Mangoaingu = ‘’

Le Hoai viết 20:30 ngày 30/09/2018

àm

Nếu condition thứ nhất đúng thì nó sẽ bỏ qua condition thứ 2.
Nếu check bằng java thì thực ra cũng mất thời gian so sánh.
Ở link bạn đưa mình không thấy thông tin gì

vũ xuân quân viết 20:34 ngày 30/09/2018

Ở link bạn đưa mình không thấy thông tin gì

Mình xin lỗi. Mình đưa thông tin sai.

Khánh Hưng Nguyễn viết 20:40 ngày 30/09/2018

Để tìm kiếm hiệu quả em nên viết vào store procedure. Vừa bảo mật, vừa thao tác nhanh. (em có thể đọc thêm cách làm store procedure trên mạng nhé).

Lưu ý :

  • Câu lệnh select không nên là select * mà select column cụ thể.
  • Đặt điều kiện ISNULL(tên cột, giá trị trả về) để trả kết quả khác null.
  • Khai báo biến để đầu vào và chuỗi sao cho hợp lý (kiểu biến đầu vào dựa vào kiểu value type của bảng tìm kiếm).
  • Giả sử có tìm kiếm theo biến đầu vào có thể sử dụng câu lệnh RTRIM or LTRIM(@bien) để kiểm tra sau đó mới begin set và end. Lưu ý, like sẽ chậm hơn so với = em nhé.
  • Inner Join hay Left Join để ý các index đã đặt trước đó, hạn chế join bất cân bằng.

Vài lời em tham khảo thêm nhé.

viết 20:33 ngày 30/09/2018

Rất bổ ích…Em cảm ơn các anh rất nhiều ạ…

Thái Nguyễn viết 20:42 ngày 30/09/2018

Rất Hay!! Cám ơn mọi người đã chia sẻ.

Reoteu Ray viết 20:32 ngày 30/09/2018

mình từng viết thế naỳ tuy ngắn ngọn nhưng chạy rất chậm…

Văn Dương viết 20:31 ngày 30/09/2018

Tìm hiểu Linq to SQL nhé.

Bài liên quan
0