在 MS SQL 服务器中使用 offset 和 fetch with case

Use offset and fetch with case in MS SQL server

我想有条件地使用偏移量。只有当我的条件满足时,才应该使用偏移量获取行。否则,return 整个数据。但我认为下面的语法是错误的。执行此操作的正确方法是什么?

DECLARE @page int
set @page = 2

DECLARE @check int
set @check = 2

SELECT * FROM HolonSsoRequest ORDER BY 1 DESC
CASE WHEN @check = 2
THEN
OFFSET @page ROWS FETCH NEXT @page ROWS ONLY;
END

你的语法在上面到处都是。例如,您的 ENDafter 语句结束(由语句终止符 (;) 定义),并且您正在尝试使用CASE expression 就像是 Case (Switch) 语句。 Case (Switch) 语句在 Transact-SQL.

中不存在

考虑到您查询的简单性,我个人会这样做,并使用动态语句:

DECLARE @Page int,
        @Check int;
SET @page = 2;
SET @Check = 2;

DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(10);

SET @SQL = N'SELECT *' + @CRLF +
           N'FROM dbo.HolonSsoRequest' + @CRLF + 
           N'ORDER BY {Column Name} DESC' + --Don't use Ordinal Positions: https://sqlblog.org/2009/10/06/bad-habits-to-kick-order-by-ordinal
           CASE @Check WHEN 2 THEN @CRLF + N'OFFSET @Page ROWS FETCH NEXT @Page ROWS ONLY;' ELSE N';' END;

--PRINT @SQL; --YOur debugging friend

EXEC sp_executesql @SQL, N'@Page int', @Page;

您可以简单地使用 IF ... ELSE

DECLARE @page integer;
DECLARE @check integer;

SET @page = 2;
SET @check = 2;

IF @check = 2
BEGIN
  SELECT *
         FROM holonssorequest
         ORDER BY 1 DESC
         OFFSET @page ROWS
         FETCH NEXT @page ROWS ONLY;
END
ELSE
BEGIN
  SELECT *
         FROM holonssorequest
         ORDER BY 1 DESC;
END;

或者使用两个 CASE 表达式,一个用于偏移量,一个用于计算结果为 0 的限制或 table 中的行数(如果变量未指示限制)结果。

SELECT *
       FROM holonssorequest
       ORDER BY 1 DESC
       OFFSET CASE
                WHEN @check = 2 THEN
                  @page
                ELSE
                  0
               END ROWS
       FETCH NEXT CASE
                    WHEN @check = 2 THEN
                      @page
                    ELSE
                      (SELECT count(*)
                              FROM holonssorequest)
                  END ROWS ONLY;