16

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

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

4 回答 4

40

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

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

于 2013-01-28T08:03:42.673 回答
12

你可以做

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;
于 2013-01-28T08:02:54.717 回答
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%'
于 2013-01-28T10:03:38.173 回答
2

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

SELECT ROWNUM AS SNO,ID,NAME,EMAIL,BRANCH FROM student WHERE NAME LIKE '%ram%';
于 2014-10-06T15:06:33.893 回答