サブクエリまたは CTE に式を配置するのと同様に、式を繰り返すのも 1 つの方法です。たとえば、次のようになります。
;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;
しかし、式を繰り返す代わりに、実際に 2 次 by の条件を実行するかどうかは問題ではないようです。では、単に既存のORDER BY
ものを次のように変更してみませんか。
ORDER BY CASE WHEN @SortBy = 1 THEN a.Date_Created END DESC,
VoteCount DESC;
この場合、 if@SortBy
は 2 で、最初の式はNULL
であるため、目的の順序付けは引き続き実現されます。が 1 の場合@SortBy
、日付の降順で並べ替えられます。 との同点が多くDate_Created
、その場合、 でソートされた同点を表示したくないVoteCount DESC
場合を除き、 による 2 番目の順序は重要ではないため、ラップする必要はありません。それを第二のCASE
表現で。
CASE
ちなみに、式を に導入すると、SQL Server がクエリを解析/評価する方法が変更され、リストORDER BY
からエイリアスを参照できなくなるためです。これが、句から をSELECT
削除しても、無効な列名について文句を言わなくなった理由です。CASE
ORDER BY