Lặp lại biểu thức là một cách, như là đặt nó trong một subquery hoặc CTE, ví dụ:
;WITH cte AS
(
SELECT
a.PostID
,a.Title
,a.Date_Created
,(SELECT COUNT(VoteID)
FROM VoteTable WHERE PostID = a.PostID) AS VoteCount
FROM dbo.PostTable AS a
INNER JOIN dbo.Users AS b
ON a.Created_UserID = b.UserID
WHERE a.Approved = 1
)
SELECT PostID, Title, Date_Created, VoteCount
FROM cte
ORDER BY
CASE @SortBy
WHEN 1 THEN Date_Created END DESC,
CASE @SortBy
WHEN 2 THEN VoteCount END DESC;
Nhưng thay vì lặp lại biểu thức, nó dường như không quan trọng nếu bạn thực sự thực hiện điều kiện cho lệnh thứ hai. Vậy tại sao không chỉ đơn giản là thay đổi hiện tại của bạn ORDER BY
tới:
ORDER BY CASE WHEN @SortBy = 1 THEN a.Date_Created END DESC,
VoteCount DESC;
Trong trường hợp này nếu @SortBy
là 2, khái niệm đầu tiên là NULL
, và do đó đặt mong muốn của bạn vẫn đạt được. Khi @SortBy
là 1, nó được sắp xếp theo ngày giảm dần và trừ khi có nhiều mối quan hệ với Date_Created
và trong trường hợp đó bạn không muốn xem các quan hệ đó được sắp xếp theo VoteCount DESC
, thứ tự thứ cấp không quan trọng, vì vậy bạn không không cần bọc nó trong biểu thức CASE
thứ hai. Lý do, nhân tiện, là khi bạn giới thiệu một biểu thức CASE
đến ORDER BY
, bạn thay đổi cách SQL Server có thể phân tích cú pháp/đánh giá truy vấn và bạn không còn có thể tham chiếu một bí danh từ danh sách SELECT
nữa. Đây là lý do tại sao xóa số CASE
khỏi điều khoản ORDER BY
không còn phàn nàn về tên cột không hợp lệ nữa.
Nguồn
2013-08-06 23:55:16
Nó cho tôi biết tên cột không hợp lệ. SQL Server 2008 – user1447679