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

PL/SQL查询:如何获取指定ID后至下一个非空ID前的所有行

解决方案

你的原语句只筛选了ID='TST'的行,而目标子项行的ID是NULL,所以根本查不到。要获取TST对应的所有子项,关键是先把TST和它后续的NULL行归为同一组,再在组内筛选。

以下提供两种可行的PL/SQL写法:

方法一:用窗口函数分组

利用COUNT(ID) OVER()窗口函数的特性:遇到非空ID时计数递增,NULL行则保持计数不变,这样TST和它的所有子项会被标记为同一个分组ID。

SELECT code
FROM (
    SELECT 
        code,
        -- 生成分组ID:每遇到非空ID,分组号+1
        COUNT(ID) OVER (ORDER BY ROWID) AS group_id,
        -- 定位TST所在的分组号
        MAX(CASE WHEN ID = 'TST' THEN COUNT(ID) OVER (ORDER BY ROWID) END) OVER () AS target_group
    FROM your_table_name -- 替换成你的表名
) t
WHERE group_id = target_group
AND LENGTH(code) = 15;

注意:如果你的表有明确的逻辑排序字段(比如自增ID、创建时间戳),请把ROWID替换成该字段,因为ROWID的顺序不一定和数据的插入/逻辑顺序完全一致。

方法二:通过行号范围筛选

先给每行分配行号,找到TST的行号,再找到TST之后第一个非空ID的行号,最后取这两个行号之间的行(如果TST是最后一个非空ID,则取所有TST之后的行)。

WITH row_nums AS (
    SELECT 
        code,
        ID,
        ROW_NUMBER() OVER (ORDER BY ROWID) AS rn -- 同样建议替换为实际排序字段
    FROM your_table_name
),
tst_row AS (
    SELECT rn FROM row_nums WHERE ID = 'TST'
),
next_non_null_row AS (
    SELECT MIN(rn) AS rn 
    FROM row_nums 
    WHERE rn > (SELECT rn FROM tst_row) AND ID IS NOT NULL
)
SELECT code
FROM row_nums
WHERE rn > (SELECT rn FROM tst_row)
-- 如果TST之后没有其他非空ID,则取所有后续行
AND ((SELECT rn FROM next_non_null_row) IS NULL OR rn < (SELECT rn FROM next_non_null_row))
AND LENGTH(code) = 15;

内容的提问来源于stack exchange,提问作者Oscar Kohn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:52:24