2017-08-04 51 views
1

我想在我的表中选择后只是其中的一部分,我读00006和停止时,我读下一模式00XXX选择。(这里是00040,但它可能是另一个号码)选择只有一个序列

00006 
123456 
456789 
123789 
00040 
125478 
547896 
454623 
519846 
00001 
.... 

这里,例如我想用一个选择只得到这些值:

怎样的方式来获得?我没有找到任何线索。

感谢您的帮助。

PS:我有变换,其中i选择

与查尔斯的解表没有任何权限:

with marker as (
    select rownumber() over() as rowno 
      , rrn(t) as recno, cast(substr(YYYYYY, 1, 5)as integer) as markvalue 
    from fap1t010.£$ZZZZZZ t 
    where substr(YYYYYY, 1, 5) like ('00___') 
), dataa as (
    select rrn(t) as recno, cast(substr(YYYYYY, 1, 6)as integer) as datavalue 
    from fap1t010.£$ZZZZZZ t 
    where substr(YYYYYY, 1, 5) NOT like ('00006') 
    and substr(YYYYYY, 13, 1) ='C' 
), ranges as(
    select a.markvalue 
     , a.recno as startrec 
     , b.recno as endrec 
    from marker A join marker B 
    on b.rowno = a.rowno +1 
) 
select distinct d.datavalue 
from ranges R join dataa D 
     on d.recno between r.startrec and r.endrec 
where r.markvalue = 00006 
+0

表中没有其他列吗? – Charles

+0

不,我在表中只有一个列表 – Cass

+0

现在如何访问它?我甚至无法想象RPGLE如上所述读取表格...... – Charles

回答

1

哇...这是一个丑陋的请求。

但是这是可以做到:

with marker as (
    select rownumber() over() as rowno 
      , rrn(t) as recno, myfld as markvalue 
    from dtcwilt.temp t 
    where myfld like ('00___ ') 
), data as (
    select rrn(t) as recno, myfld as datavalue 
    from dtcwilt.temp t 
    where myfld NOT like ('00___ ') 
), ranges as(
    select a.markvalue 
     , a.recno as startrec 
     , b.recno as endrec 
    from marker A join marker B 
    on b.rowno = a.rowno +1 
) 
select d.datavalue 
from ranges R join data D 
     on d.recno between r.startrec and r.endrec 
where r.markvalue = '00006'; 

如果你有一个大的数据集,性能不会是所有伟大;有可能有改进的余地。但以上至少容易理解。

如果您恰好在IBM i的最新版本7.3上,则可以通过使用新的LEAD()和/或LAG()函数简化说明。但我没有7.3来测试。

+0

今天我会尝试你的解决方案,我会保持更新 – Cass

+0

Thx,你的解决方案效果很好!多谢 ! – Cass