Powtarzanie tego wyrażenia jest w jedną stronę, jak to jest umieszczenie w podkwerendzie lub CTE, np
;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;
Zamiast powtarzać wyrażenie, to nie wydaje się mieć znaczenia, jeśli naprawdę wykonasz warunkowe dla drugiego rzędu przez. Więc dlaczego nie po prostu zmienić istniejący ORDER BY
do:
ORDER BY CASE WHEN @SortBy = 1 THEN a.Date_Created END DESC,
VoteCount DESC;
W tym przypadku, jeśli @SortBy
wynosi 2, pierwszy wyraz jest NULL
, a więc pożądany Zamawiający nadal osiągnięty. Gdy @SortBy
ma wartość 1, jest uporządkowane według daty malejącej, a jeśli nie ma zbyt wielu powiązań z Date_Created
, a w tym przypadku , nie chcesz zobaczyć te powiązania posortowane według VoteCount DESC
, kolejność drugorzędna jest nieistotna, więc nie musisz Trzeba go zawinąć w drugim wyrażeniu CASE
.
Powodem, nawiasem mówiąc, jest to, że kiedy wprowadzić wyrażenie CASE
do ORDER BY
, należy zmienić sposób SQL Server może analizować/oceny zapytania i nie można już odwołać alias z listy SELECT
. Właśnie dlatego usunięcie klauzuli CASE
z klauzuli ORDER BY
nie powoduje już narzekania na niepoprawną nazwę kolumny.
Podaje mi niepoprawną nazwę kolumny. SQL Server 2008 – user1447679