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
相关产品推荐
相关产品推荐

