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 ..