行号函数中的Sql Server别名

行号函数中的Sql Server别名,sql,sql-server-2012,row-number,Sql,Sql Server 2012,Row Number,我无法在where条件中引用RowNum,因为它显示无效的列名“RowNum”。请帮助我使用正确的语法来获得结果 编辑-更改的需求 我试图像上面那样包含行编号函数,但得到的排序依据列无效。您需要在派生表中嵌套行编号: SELECT * FROM ( select id, portfolio, CASE WHEN l.posted_on IS NULL THEN CONVERT(VARCHAR(40),l.created_on,120)

我无法在where条件中引用RowNum,因为它显示无效的列名“RowNum”。请帮助我使用正确的语法来获得结果

编辑-更改的需求


我试图像上面那样包含行编号函数,但得到的排序依据列无效。

您需要在派生表中嵌套行编号:

SELECT * FROM 
( 
     select id, portfolio, 
     CASE WHEN l.posted_on IS NULL 
          THEN CONVERT(VARCHAR(40),l.created_on,120) 
          ELSE CONVERT(VARCHAR(40),l.posted_on,120) 
     END AS sort_by, 
     ROW_NUMBER() OVER(order by sort_by DESC) AS RowNum 
     from research 
     where created_by = 'Adam Cohen' 
) x 
WHERE x.RowNum BETWEEN 5 AND 10 

您需要将投影包装到派生表中,尽管您可以删除内部tmp表:

编辑

请注意,如果您在最终选择中实际上不需要伪行号,那么自Sql 2012以来,在“数据页”场景中,您将能够使用apply,而不需要行号或派生表:

SELECT * FROM
(
    select id, portfolio,
       ROW_NUMBER() OVER(order by id DESC) AS RowNum 
    from 
       research
    where created_by = 'Adam Cohen'
) x
WHERE x.RowNum BETWEEN 5 AND 10
编辑2,重新定义新需求

可以更简洁地表示为

CASE WHEN l.posted_on IS NULL 
   THEN CONVERT(VARCHAR(40),l.created_on,120) 
   ELSE CONVERT(VARCHAR(40),l.posted_on,120) 
END AS sort_by
但是,如果仍然需要原始行号,也可以按窗口函数的顺序使用此投影,为了使其干燥,需要嵌套的派生表。您仍然可以使用paginate旁边的SQL 2012偏移量/提取,但是:

CONVERT(VARCHAR(40), COALESCE(posted_on, created_on)) AS AS sort_by

从SELECT id、公文包、大小写中选择*当l.posted_on为空时,然后选择CONVERTVARCHAR40、l.created_on、120 ELSE CONVERTVARCHAR40、l.posted_on、120 END AS sort_by,ROW_NUMBER OVERorder by sort_by DESC AS RowNum from research where created_by='Adam Cohen'x where x.RowNum介于5和10之间我试图像上面那样包含ROW_NUMBER函数,但我得到的sory_by列无效。@VijayVSTO,l可能是一个新表的别名,在你的原始问题中没有引用,因为你现在在混合中引入了一个案例,事情显然与你的原始问题完全不同。请发布实际问题的MVCE,我们可以提供帮助。不便之处,敬请原谅。我在表中创建了两列并发布了两列。如果发布的日期为空,我必须使用created_on列。然后我需要取中间的记录。
select id, portfolio
from research
where created_by = 'Adam Cohen'
order by id desc
offset 5 rows fetch next 6 rows only;
CASE WHEN l.posted_on IS NULL 
   THEN CONVERT(VARCHAR(40),l.created_on,120) 
   ELSE CONVERT(VARCHAR(40),l.posted_on,120) 
END AS sort_by
CONVERT(VARCHAR(40), COALESCE(posted_on, created_on)) AS AS sort_by
SELECT *,
       ROW_NUMBER() OVER(order by sort_by DESC) AS RowNum 
FROM
(
    SELECT id, portfolio, CONVERT(VARCHAR(40), COALESCE(posted_on, created_on)) AS sort_by
    from research 
    where created_by = 'Adam Cohen' 
) y
ORDER BY id DESC
OFFSET 5 ROWS FETCH NEXT 6 ROWS ONLY;