2008-12-09 39 views
8

Tôi có một thủ tục lưu trữ được gọi là spGetOrders chấp nhận một vài tham số: @startdate và @enddate. Truy vấn này có một bảng "Đơn đặt hàng". Một trong các cột trong bảng được gọi là "ClosedDate". Cột này sẽ giữ NULL nếu một đơn đặt hàng chưa được đóng hoặc giá trị ngày nếu nó có. Tôi muốn thêm một tham số @Closed sẽ mất một giá trị bit. Trong một thế giới đơn giản, tôi muốn có thể làm ..SQL có điều kiện ở đâu

select * from orders o 
where o.orderdate between @startdate AND @enddate 
and (if @Closed = 1 then o.ClosedDate IS NULL else o.ClosedDate IS NOT NULL) 

Rõ ràng, đó không phải đi làm việc .. Tôi cũng đang nhìn vào sql năng động đó là phương sách cuối cùng của tôi, nhưng bắt đầu trông giống như câu trả lời ..

Xin giúp ..

Trả lời

14

Hãy thử điều này:

select * from orders o 
where o.orderdate between @startdate AND @enddate 
and ((@Closed = 1 And o.ClosedDate IS NULL) Or (@Closed = 0 And o.ClosedDate IS NOT NULL)) 

Hãy thay đổi cẩn thận khi trộn AND và OR trong mệnh đề where. Khi làm điều này, dấu ngoặc đơn để kiểm soát thứ tự đánh giá là rất quan trọng.

+1

Đây là một cách tuyệt vời để khắc phục vấn đề này. Cảm ơn vì cách tiếp cận này! – Noah

2

SQL Statement:

SELECT * 
FROM orders 
WHERE orderdate BETWEEN @startdate AND @enddate 
AND (@Closed = 1 OR CLosedDate IS NOT NULL) 
+1

Xem ra cho các vấn đề của bạn VÀ/HOẶC - bạn cần ngoặc! –

0

Hoặc này:

select * from orders o 
where o.orderdate between @startdate AND @enddate 
and ( (@Closed = 1 AND o.ClosedDate IS NULL) 
    OR (ISNULL(@Closed, 0) <> 1 AND o.ClosedDate IS NOT NULL) 
    ) 

Dường như bạn muốn tất cả các đơn đặt hàng giữa hai ngày có thông tin Đóng không phù hợp. Các đề xuất khác có lẽ là tốt (hoặc tốt hơn) nhưng tôi khá chắc chắn rằng công trình này và có thể đọc được với tôi (hầu hết các gợi ý khác xuất hiện khi tôi đang gõ).

Chúc may mắn!

0

Cơ bản, viết nó ra.

select * from orders o 
where o.orderdate between @startdate AND @enddate 
and ((@Closed = 1 and o.ClosedDate IS NULL) 
    or (@Closed != 1 and o.ClosedDate IS NOT NULL)) 

đôi, có thể được gỡ bỏ

Các vấn đề liên quan