【问题标题】:Skip 'N' rows and fetch all available跳过“N”行并获取所有可用的
【发布时间】:2016-07-08 05:47:48
【问题描述】:

我有一个简单的要求,我想跳过“N”行并获取所有可用的数据。我需要它作为我的存储过程的一部分,例如

 WHERE /*some condition*/   
 ORDER BY 
        /* some case statement */    
OFFSET @SkipRows ROWS FETCH NEXT @TakeRows ROWS ONLY

现在我的要求是如果@TakeRows 是某个值,比如-1,我想获取所有行。我试图避免额外调用来计算行数

【问题讨论】:

  • 我正在使用 sqlserver2008r2 order by 子句是动态的,我已经有 case 语句我更担心跳过和获取行
  • 是的,我之前看到过这个链接,但到目前为止没有发现当前查询有任何问题
  • 我不能在那里放一些 if 子句,我试过了,但它给出了编译错误
  • 根据您要跳过的行数,实际上将所有行选择到您需要使用它的位置并跳过这些行可能会更容易和更快;而不是在查询中进行。

标签: sql sql-server database sql-server-2008 query-performance


【解决方案1】:

你可以这样试试:

WITH x AS
(
    SELECT col1, col2,
    ROW_NUMBER() OVER (ORDER BY col1) AS rn
    FROM YourTable
)
SELECT col1, col2 FROM  x
WHERE rn BETWEEN @start AND @End

这里@start 和@End 是您要在其间获取的行。

【讨论】:

  • 我发布的查询是简化版本,它已经分区我更担心跳过和获取部分
  • @AnshulNigam:- 正如我发布的那样,您只需向变量 @start@end 提供值,即您要获取的行。例如,如果您想获取从 5 到 10 的行,那么只需将其分别放入 5 和 10。
  • 我的要求是跳过“5”行并根据一些变量获取所有可用的数据
【解决方案2】:

试试类似的,

WHERE /*some condition*/   
ORDER BY 
        /* some case statement */    
OFFSET @SkipRows ROWS FETCH NEXT ISNULL(NULLIF(@TakeRows,-1),999999) ROWS ONLY

【讨论】:

  • 用你的解决方案我只能获取下一个'999999'
  • 您可以根据自己的数据猜测调整数字。
【解决方案3】:
WHERE /*some condition*/   
 ORDER BY 
        /* some case statement */    
OFFSET @SkipRows ROWS FETCH NEXT @TakeRows ROWS ONLY

如果@SkipRows 是一个变量,并且如果您想返回ALL,则应给出-1 行...然后使用单独的查询。

IF @SkipRows <= 0
    THEN BEGIN
            SELECT  TOP (@TakeROws) *
            FROM    <table>
            WHERE   <predicate>  
            ORDER BY 
             /* some case statement */    
         END
    ELSE BEGIN
            SELECT  *
            FROM    <table>
            WHERE <predicate>
            ORDER BY /*some case statement*/
            OFFSET @SkipRows FETCH NEXT @TakeRows ONLY
         END
    END

或者使用 CASE 声明,无论对你有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    相关资源
    最近更新 更多