使用ROWNUM=1未获取NULL值,如何优先返回NULL值?
如何获取排序后的第一个NULL值?
这是Oracle里一个很常见的ROWNUM使用误区,我来帮你理清楚问题所在以及解决方法~
问题原因
你遇到的核心问题是Oracle中ROWNUM的分配时机:
Oracle的SQL执行顺序是:WHERE条件过滤 → 分配ROWNUM → 执行ORDER BY。
所以你原来的语句:
Select AT.PRE_LAST_DATE From AUTHORIZATION AT Where AT.PROJECT_ID = 5 and AT.PRE_DESIG_ID = 48 and ROWNUM = 1 Order By AT.ID Desc;
是先从符合PROJECT_ID=5和PRE_DESIG_ID=48的行里取了第一行(这一行的存储顺序可能是那个有日期的记录),之后才对这一行做排序,自然得不到你想要的排序后的第一个NULL。
解决方案
方法一:子查询先排序,再取ROWNUM=1
通过子查询先完成排序,得到你期望的顺序(NULL在前),再在外层筛选第一行:
SELECT PRE_LAST_DATE FROM ( SELECT AT.PRE_LAST_DATE FROM AUTHORIZATION AT WHERE AT.PROJECT_ID = 5 AND AT.PRE_DESIG_ID = 48 ORDER BY AT.ID DESC ) WHERE ROWNUM = 1;
方法二:使用FETCH FIRST(Oracle 12c及以上版本)
如果你用的是Oracle 12c或更高版本,可以用更简洁的FETCH FIRST语法,它会先执行排序再取第一行:
SELECT AT.PRE_LAST_DATE FROM AUTHORIZATION AT WHERE AT.PROJECT_ID = 5 AND AT.PRE_DESIG_ID = 48 ORDER BY AT.ID DESC FETCH FIRST 1 ROW ONLY;
这两种方法都能让你得到按AT.ID DESC排序后的第一个NULL值。
内容的提问来源于stack exchange,提问作者Ehsan
相关产品推荐
相关产品推荐

