如何从Oracle中的选定行获取行号

Tus*_*har 10 sql oracle rownum

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

select * from student where name is like %ram%
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)

我需要得到哪个分支是B5的行号.预期值为"5"

有人可以建议如何在查询中实现这一点?

Ben*_*Ben 29

表没有固有的排序.因此,行号本身是无意义的度量.

但是,您可以使用ROWNUM psuedocolumn或更强大的分析函数来获取结果集的行号.ROW_NUMBER()

由于没有对表的排序,因此需要显式的ORDER BY子句才能工作.

select rownum, a.*
  from ( select *
           from student
          where name like '%ram%'
          order by branch
                ) a
Run Code Online (Sandbox Code Playgroud)

或使用分析查询

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

你的语法where name is like ...不正确,不需要IS,所以我删除了它.

ORDER BY在这里依赖于二进制排序,因此如果分支以除B之外的任何内容开始,则结果可能不同,例如b大于B.


Daz*_*zaL 10

你可以这样做

select rownum, l.* from student  l where name like %ram%
Run Code Online (Sandbox Code Playgroud)

这会在获取行时分配行号(因此当然不能保证排序).

如果你想先订购:

select rownum, l.*
  from (select * from student l where name like %ram% order by...) l;
Run Code Online (Sandbox Code Playgroud)


小智 5

我认为使用

select rownum st.Branch 
  from student st 
 where st.name like '%ram%'
Run Code Online (Sandbox Code Playgroud)

是一个简单的方法;您应该在 LIKE 语句中添加单引号。如果您使用row_number(),您应该添加over (order by 'sort column' 'asc/desc'),例如:

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