【问题标题】:Use offset and fetch with case in MS SQL server在 MS SQL 服务器中使用偏移量和获取大小写
【发布时间】:2019-12-18 12:27:55
【问题描述】:

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

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

【问题讨论】:

标签: sql sql-server case offset


【解决方案1】:

您可以简单地使用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 的限制或表中的行数(如果变量未指示限制结果)。

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;

【讨论】:

  • 这个答案实际上回答了这个问题,当我从搜索中被引导到这里时,这对我来说非常棒。
【解决方案2】:

你的语法在上面到处都是。例如,您的END 位于语句的结尾之后(由语句终止符 (;) 定义),并且您正在尝试使用 CASE 表达式 就像是 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;

【讨论】:

  • 如何转换@Page。这是它正在打印的 sql 语句 -> SELECT * FROM dbo.HolonSsoRequest OFFSET @ Page ROWS FETCH NEXT @ Page ROWS ONLY;
  • 你是什么意思“转换@页面”,@PrashantYadav?在我的声明中,@Page 没有任何转换,您的示例查询中也没有。你为什么要尝试CONVERT呢? OFFSET 需要整数值,这就是 @Page 的含义。
  • @页面应该得到上面声明的值。目前@Page 正在按原样打印。而且我收到错误-> SELECT * FROM dbo.HolonSsoRequest OFFSET @ Page ROWS FETCH NEXT @ ROWS ONLY;消息 102,级别 15,状态 1,第 4 行“@ Page”附近的语法不正确。消息 153,级别 15,状态 2,第 4 行 FETCH 语句中选项 NEXT 的使用无效
  • @PrashantYadav 在“@Page”附近?我的代码中没有@ Page,只有@page
  • @PrashantYadav 在没有ORDER BY 的情况下能够OFFSET 毫无意义。当 RDBMS 不知道从哪里开始时,如何在“跳过”第一个 y 之后为您提供“下一个”x 行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 2013-02-09
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 2014-07-12
相关资源
最近更新 更多