代码之家  ›  专栏  ›  技术社区  ›  Arulkumar KP.

行号()仅适用于前N个记录

  •  4
  • Arulkumar KP.  · 技术社区  · 6 年前

    我有一个场景,根据 Id ROW_NUMBER() . 但现在预期的行为有了一点变化。

    前五名记录 只有 IndexValue 需要显示,对于剩余的条目 索引值 应该是 NULL .

    通过 行号() @PopulateValues ,然后使用 UPDATE

    我尝试过:

    -- Actual Table in database
    DECLARE @OriginalTable TABLE (Id INT IDENTITY(1, 1), [Name] VARCHAR (255));
    INSERT INTO @OriginalTable ([Name]) VALUES 
    ('Name 01'), ('Name 02'), ('Name 03'), ('Name 04'), ('Name 05'), 
    ('Name 06'), ('Name 07'), ('Name 08'), ('Name 09'), ('Name 10'), 
    ('Name 11'), ('Name 12'), ('Name 13'), ('Name 14'), ('Name 15');
    
    -- Table variable for the populate calculation
    DECLARE @PopulateValues TABLE (Id INT, [Name] VARCHAR (255), IndexValue INT NULL);
    INSERT INTO @PopulateValues (Id, [Name], IndexValue)
    SELECT Id, [Name], ROW_NUMBER() OVER (ORDER BY Id) - 1 AS IndexValue
    FROM @OriginalTable;
    
    UPDATE @PopulateValues SET IndexValue = NULL WHERE IndexValue >= 5;
    
    SELECT * FROM @PopulateValues;
    

    行号() 只为 TOP N 记录while SELECT

    3 回复  |  直到 6 年前
        1
  •  6
  •   Mureinik    6 年前

    你需要一个 case 查询中的表达式:

    SELECT Id, Name, CASE WHEN IndexValue < 5 THEN IndexValue END AS IndexValue
    FROM   (SELECT Id, Name, ROW_NUMBER() OVER (ORDER BY Id) - 1 AS IndexValue
            FROM   @OriginalTable) t
    
        2
  •  2
  •   Ryan Wilson    6 年前

    可以将CASE语句与子查询一起使用,如下所示:

    INSERT INTO @PopulateValues (Id, [Name], IndexValue)
    SELECT x.[Id], x.[Name], CASE WHEN x.IndexValue < 5 THEN x.IndexValue ELSE NULL END AS [IndexValue]
    FROM
    (
    SELECT Id, [Name], ROW_NUMBER() OVER (ORDER BY Id) - 1 AS IndexValue
    FROM @OriginalTable;
    ) AS x
    
        3
  •  2
  •   Arulkumar KP.    6 年前

    因为我找到了一个更可行的方法 Logical Function - IIF (从SQL Server 2012开始),因此查询将是:

    SELECT Id, [Name], IIF(IndexValue < 5, IndexValue, NULL) AS IndexValue 
    FROM  ( SELECT Id, Name, ROW_NUMBER() OVER (ORDER BY Id) - 1 AS IndexValue
            FROM @OriginalTable ) Q