Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Nhiều điều kiện trong mệnh đề WHERE

Bạn có thể sử dụng một cái gì đó như thế này:

select * 
from @Accessories 
where (@Param = 0)
  or (@Param = 1 and atype = 'HDD') 
--or (@Param = 1 and itype = 1) , if itype and atype are connected
  or (@Param = 2 and atype != 'HDD')
option (recompile)

Nếu Param là 0 thì điều kiện đầu tiên sẽ trở thành 0=0 và đối sánh cho tất cả các hàng, vì vậy tất cả các hàng đều được trả về. Nếu tham số là 1 hoặc 2, chỉ có tương ứng hoặc nhánh phù hợp với điều kiện đầu tiên, do đó, nó trả về những gì điều kiện thứ hai chỉ định.

Ngoài ra, tùy chọn option (recompile) là thực sự quan trọng (xem bài báo trong bình luận của Martin). Nó hướng dẫn máy chủ SQL sử dụng các giá trị thời gian chạy của các tham số khi chuẩn bị kế hoạch thực thi, về cơ bản:

  • khi @Param =0 truy vấn trở thành select * from @Accessories
  • khi @Param =1 truy vấn trở thành select * from @Accessories where atype = 'HDD'
  • khi @Param =2 truy vấn trở thành select * from @Accessories where atype != 'HDD'


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PIVOT trong sql 2005

  2. Truy xuất> 901 hàng từ máy chủ được liên kết SQL Server 2008 với Active Directory

  3. Thao tác không hợp lệ đối với trạng thái lỗi giao dịch và phạm vi giao dịch

  4. Chèn mảng byte VÀO bản ghi varbinary (max)

  5. Làm cách nào để sử dụng hàm CONCAT trong SQL Server 2008 R2?