我们以机构表为例,机构表中的id字段是varchar2类型的,而不是number类型,所有要先转换为number。
select to_number(id) as id from ORGANIZATION;
运行效果如下图所示:
我们按降序排序来查询,
select to_number(id) as id from ORGANIZATION ORDER BY id DESC;
如下图所示:
我们不使用order by,而用max()函数来获取最大的值
select max(to_number(id)) from ORGANIZATION;
运行效果如下图所示:我们得到最大值为33.
现在我们要找出第二大值,我们要使用到ROWNUM,我们先查询出最大值和第二大值。
select * from (select to_number(id) as id from ORGANIZATION ORDER BY id desc) where ROWNUM<3;
运行效果如下图所示:
有了最大值和第二大值,如何查询出第二大值呢?
我们可以使用如下语句来查看这些结果是如何排序的。
select ROWNUM r,id from(select to_number(id) as id from ORGANIZATION ORDER BY id desc);
接下来,我们就可以在上面的基础上稍作处理,就可以查询出第二大值这条记录了
select * from (select ROWNUM r,id from(select to_number(id) as id from ORGANIZATION ORDER BY id desc)where ROWNUM<3) e where e.r>1 ;
运行效果如下图:
我们不能使用如下语句来得到第二大值:
select id from (select to_number(id) as id from ORGANIZATION ORDER BY id desc) where ROWNUM<3 and ROWNUM>=2
运行结果是空
这是为什么呢?
因为rownum是oracle预处理字段,默认标序是1,只有记录集已经满足条件后才会进行后续编号。这样你查询ORGANIZATION 表时遍历第一条数据时rownum是1,不符合条件,继续遍历到第二条数据rownum仍为1,仍不符合条件,直至遍历完所有数据,都无数据返回。