Jam*_*Hay 10 sql t-sql sql-server-2008
我有以下SP用于分页新闻文章列表.正如您可能猜到的那样,@count
要返回的行数@start
是从中选择行的索引(按内部查询排序),@orderby
表示要排序的列,并@orderdir
指示是排序一个方向还是另一个方向.在添加参数之前,我的原始查询就
在这里@orderdir
.
ALTER PROCEDURE [mytable].[news_editor_paginate]
@count int,
@start int,
@orderby int,
@orderdir int
AS
BEGIN
SET NOCOUNT ON;
SELECT TOP (@count) * FROM
(
SELECT ne.*,n.publishstate,
(CASE WHEN @orderdir = 1 THEN
ROW_NUMBER() OVER (
ORDER BY
CASE WHEN @orderby = 0 THEN ne.[time] END DESC,
CASE WHEN @orderby = 1 THEN ne.lastedit END DESC,
CASE WHEN @orderby = 2 THEN ne.title END ASC
)
WHEN @orderdir = 2 THEN
ROW_NUMBER() OVER (
ORDER BY
CASE WHEN @orderby = 0 THEN ne.[time] END ASC,
CASE WHEN @orderby = 1 THEN ne.lastedit END ASC,
CASE WHEN @orderby = 2 THEN ne.title END DESC
)
END
) AS num
FROM news_edits AS ne
LEFT OUTER JOIN news AS n
ON n.editid = ne.id
)
AS a
WHERE num > @start
END
Run Code Online (Sandbox Code Playgroud)
现在没有任何问题,但@orderby
参数不起作用.如果提供1作为@orderdir
参数,它将给出与我提供2作为该参数完全相同的结果.
Gat*_*ats 17
行号不会在每一行上进行评估,但无论如何都是case语句,因此无论如何都会被rownum所困扰.
试试这个:
ROW_NUMBER() OVER (
ORDER BY
CASE WHEN @orderby = 0 AND @orderdir = 1 THEN ne.[time] END DESC,
CASE WHEN @orderby = 0 AND @orderdir = 2 THEN ne.[time] END ASC,
CASE WHEN @orderby = 1 AND @orderdir = 1 THEN ne.lastedit END DESC,
CASE WHEN @orderby = 1 AND @orderdir = 2 THEN ne.lastedit END ASC,
CASE WHEN @orderby = 2 AND @orderdir = 1 THEN ne.title END ASC
CASE WHEN @orderby = 2 AND @orderdir = 2 THEN ne.title END DESC
)
Run Code Online (Sandbox Code Playgroud)