【发布时间】:2011-05-10 11:01:15
【问题描述】:
我找到了一些用于动态排序和顺序的很棒的 sql 代码,但我想知道是否有人可以帮我重新调整它,以便下面的 PROC 中的 CTE 使用动态排序/顺序。此代码运行 - 但输出不是我所追求的,因为 ORDER BY p.ProductId 首先发生在 CTE 中,然后 ORDER BY CASE 语句仅适用于记录 6 到 10
DECLARE @Skip int
DECLARE @Take int
DECLARE @OrderBy VARCHAR(50)
SET @Skip = 5;
SET @Take = 5;
SET @OrderBy = 'PriceAsc';
WITH ProductCT AS
(
SELECT ROW_NUMBER() OVER(ORDER BY p.ProductId) AS RowNum
, p.ProductId
FROM dbo.Product AS p
)
SELECT p.ProductId
,p.Title
,p.Price
FROM dbo.Product AS p
INNER JOIN ProductCT AS pct ON pct.ProductId = p.ProductId
WHERE pct.RowNum BETWEEN @Skip + 1 AND (@Skip + @Take)
ORDER BY
CASE
WHEN @OrderBy = 'TitleAsc' THEN (RANK() OVER (ORDER BY p.Title))
WHEN @OrderBy = 'TitleDesc' THEN (RANK() OVER (ORDER BY p.Title DESC))
WHEN @OrderBy = 'PriceAsc' THEN (RANK() OVER (ORDER BY p.Price))
WHEN @OrderBy = 'PriceDesc' THEN (RANK() OVER (ORDER BY p.Price DESC))
ELSE (RANK() OVER (ORDER BY p.Price))
END
提前感谢您的任何建议:-)
【问题讨论】:
-
你为什么在
ORDER BY中使用RANK()? -
因为这是我能找到的唯一允许您将 ASC/DESC 添加到 CASE 语句的方法。我在谷歌上找到了它的代码 - 如果有更好的方法请告诉我:-)
标签: tsql pagination dynamic-sql common-table-expression