如何在Oracle中从所选行中获取行号

18

我正在从数据库中选择几行,例如:

select * from student where name is like %ram%

结果:

ID   Name     email          Branch
7    rama    rama@gmail.com    B1
5    ramb    ramb@gmail.com    B2
3    ramc    ramc@gmail.com    B3
8    ramd    ramd@gmail.com    B4
11   rame    rame@gmail.com    B5
12   ramf    ramf@gmail.com    B6
14   ramg    ramg@gmail.com    B7

我需要获取分支为B5的行号。预期值为“5”。

请问有人能建议如何在查询中实现这个功能吗?

4个回答

44

表格本身并没有内在的排序方式,因此行号本身是一个无意义的指标。

然而,你可以通过使用 ROWNUM 伪列或者更为强大的 ROW_NUMBER() 分析函数,在 结果集 中获取行号。

由于表格本身没有排序,所以两种方法都需要显式地使用 ORDER BY 子句才能正常工作。

select rownum, a.*
  from ( select *
           from student
          where name like '%ram%'
          order by branch
                ) a

或使用分析查询

select row_number() over ( order by branch ) as rnum, a.*
  from student
 where name like '%ram%'

你的语法 where name is like ... 是不正确的,没有必要使用 IS,所以我已将其删除。

这里的 ORDER BY 依赖于二进制排序,因此如果一个分支的开头不是 B,结果可能会不同,例如 b 大于 B


13

你只需要这样做

select rownum, l.* from student  l where name like %ram%

这会在获取行时分配行号(因此当然没有保证的顺序)。

如果你想要先排序,可以执行以下操作:

select rownum, l.*
  from (select * from student l where name like %ram% order by...) l;

5
我认为使用
select rownum st.Branch 
  from student st 
 where st.name like '%ram%'

这是一种简单的方法:在LIKE语句中,您应该添加单引号。如果您使用row_number()函数,则应添加over (order by '排序列' 'asc/desc')。例如:

select st.branch, row_number() over (order by 'sort column' 'asc/desc')  
  from student st 
 where st.name like '%ram%'

1
你好,欢迎来到Stack Overflow。你可以通过高亮代码并点击“{}”按钮来标记代码。花些时间学习Markdown语法,因为它可以使你的帖子更容易阅读。我对你的实际答案有两点看法;首先,它已经被其他回答完全覆盖了。其次,你的第一个查询以随机顺序返回行,因此不能保证按照问题所要求的顺序返回结果。 - Ben

2
以下查询可帮助在Oracle中获取行号:
SELECT ROWNUM AS SNO,ID,NAME,EMAIL,BRANCH FROM student WHERE NAME LIKE '%ram%';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接