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

时间:2013-01-28 07:58:38

标签: sql oracle rownum

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

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 个答案:

答案 0 :(得分:27)

表格没有固有的排序。因此,行号本身就是一个毫无意义的指标。

但是,您可以使用ROWNUM psuedocolumn或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

答案 1 :(得分:10)

你可以做到

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;

答案 2 :(得分:4)

我认为使用

select rownum st.Branch 
  from student st 
 where st.name like '%ram%'

是一种简单的方法;你应该在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%'

答案 3 :(得分:2)

以下查询有助于获取oracle中的行号,

SELECT ROWNUM AS SNO,ID,NAME,EMAIL,BRANCH FROM student WHERE NAME LIKE '%ram%';