2012-05-11 27 views
5

Hiện nay tôi có một proc lưu trữ, trong đó có một chuỗiShorthand IF báo cáo trong sql

@vari as varchar(30) 
if @vari is null 
    SELECT * FROM TABLE 
else 
    SELECT * FROM TABLE WHERE col = @vari 
endif 

là có cách nào để nội tuyến các câu lệnh if, do đó không tuyên bố 2 chọn của chỉ vì 1 param?

+0

Bạn cũng có thể làm điều này với một tuyên bố trường hợp, nó không phải là càng ngắn càng các câu trả lời dưới đây nhưng trong một số trường hợp, nó là tốt hơn . – Purplegoldfish

+0

Tôi sẽ không thay đổi mã của bạn, bởi vì trong hầu hết các trường hợp, sql sẽ tạo ra kế hoạch thực hiện tốt hơn nhiều so với các tiêu chí 'hoặc' kết hợp. –

Trả lời

15
SELECT * FROM TABLE WHERE (@vari is null or col = @vari) 
+0

Tác phẩm này, nhưng câu hỏi tiếp theo của tôi: Tại sao? Do các dấu ngoặc chỉ đánh giá các tiêu chí 1 là đúng sau đó dừng lại hay ...? – Alex

+3

@Alex: Nó vẫn đánh giá cả hai tiêu chí, nhưng vì 'hoặc', một trong hai có thể đúng cho hàng được bao gồm trong tập kết quả. Nếu '@vari là null', thì mọi hàng sẽ được trả về vì phần đầu tiên luôn đúng. Nếu không, các hàng duy nhất được trả lại sẽ là những hàng khớp với phần thứ hai, 'col = @ vari', áp dụng bộ lọc. – mellamokb

+2

Chân đế ở đây vì tôi có thói quen đặt OR trong ngoặc đơn. –

3

Giả sử col không bao giờ được NULL, bạn có thể làm điều này:

select * 
from table 
where col = isnull(@vari, col) 
Các vấn đề liên quan