2014-09-20 43 views
8
SELECT * 
FROM 
    TableName 
WHERE 
ORDER BY 
    CASE @OrderByColumn 
    WHEN 1 THEN Forename 
    WHEN 2 THEN Surname 
    END; 

Tôi có tuyên bố như trên cho phép tôi tự động chọn cách đặt hàng kết quả truy vấn. Tuy nhiên, làm thế nào để tôi chỉ định rằng tôi muốn Tên được đặt hàng DESC và Họ ASC?Tuyên bố trường hợp cho mệnh đề Theo mệnh đề với mô tả/Asc sắp xếp

+1

Vui lòng xem [bài đăng này] (http://sqlperformance.com/2012/08/t-sql-queries/conditional-order-by) và [điều này cũng có thể là một điều thú vị] (http: // blog. sqlsentry.com/aaronbertrand/sql-variant-use-case/). –

Trả lời

12

Bạn cần phải chia ORDER BY trong hai phần của bạn:

SELECT * 
FROM 
    TableName 
WHERE 
ORDER BY 
    (CASE @OrderByColumn 
    WHEN 1 THEN Forename 
    END) DESC -- Forename --> descending 
, (CASE @OrderByColumn 
    WHEN 2 THEN Surname 
    END) ASC -- Surname --> ascending 
+0

đã bỏ phiếu cho cảm ơn bạn! –

+0

Tôi có thể có nhiều hơn một cột theo thứ tự của tôi theo mệnh đề không? ví dụ. 'CASE @OrderByColumn WHEN 1 THEN Tên, ngày END DESC' –

+0

@volumeone Không phải như vậy, không. Một biểu thức 'CASE' trả về một giá trị duy nhất, vì vậy bạn cần phải lặp lại trường hợp với cột thứ hai sau dấu phẩy. – dasblinkenlight

3

Bạn cần hai điều khoản trong order by:

ORDER BY (CASE WHEN @OrderByColumn = 1 and @Dir = 'ASC' THEN Forename 
       WHEN @OrderByColumn = 2 and @Dir = 'ASC' THEN Surname 
      END) ASC, 
     (CASE WHEN @OrderByColumn = 1 and @Dir = 'DESC' THEN Forename 
       WHEN @OrderByColumn = 2 and @Dir = 'DESC' THEN Surname 
      END) DESC 
Các vấn đề liên quan