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

SQL chỉ thêm bộ lọc nếu một biến không rỗng

Bạn có thể dịch yêu cầu của mình thành:

SELECT  route_id [ROUTE_ID]
FROM route_master(NOLOCK)
WHERE  route_ou = 2
AND   (@l_s_query is null OR route_query = @l_s_query)
AND   lang_id  = 1
OPTION (RECOMPILE)

OPTION (RECOMPILE) là tùy chọn nhưng có thể đưa ra kế hoạch thực thi tốt hơn với chi phí thêm thời gian biên dịch như đã thảo luận trong bài viết chuẩn về chủ đề Điều kiện Tìm kiếm Động trong T ‑ SQL

Hoặc với COALESCE() để tránh OR :

WHERE  route_ou = 2
AND   COALESCE(@l_s_query,route_query) = route_query 
AND   lang_id  = 1

Lưu ý: Như @jarlh đã nói, nếu route_query là nullable, điều này có thể gây ra một số vấn đề do so sánh null, vì vậy bạn có thể muốn sử dụng truy vấn đầu tiên.

Một tùy chọn khác của tùy chọn này là hai truy vấn riêng biệt bằng cách sử dụng UNION ALL , một cho mỗi điều kiện -

SELECT .. FROM .. 
WHERE @l_s_query IS NULL
UNION ALL
SELECT .. FROM .. 
WHERE @l_s_query = route_query

Về hiệu suất, chỉ cái cuối cùng sẽ sử dụng chỉ mục, tôi tin rằng cái đầu tiên sẽ nhanh nhất, nhưng nó có thể thay đổi tùy thuộc vào các chỉ mục, kích thước của bảng ETC ..



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhận các điểm không gian trong bán kính bằng cách sử dụng NHibernate Spatial

  2. Cú pháp không chính xác gần ')' gọi thủ tục được lưu trữ với GETDATE

  3. Tổng một phần giữa các bản ghi khác nhau bằng cách sử dụng SQL 2008

  4. Lỗi - tràn SqlDateTime. Phải trong khoảng từ 1/1/1753 12:00:00 AM đến 12/31/9999 11:59:59 PM

  5. Microsoft SQL Server 2005/2008:Kiểu dữ liệu XML so với text / varchar