You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:35:41