下面的查询
INSERT INTO temp SELECT esd, 'E' FROM test_data_sovlp WHERE esd IS NOT NULL UNION ALL SELECT td, CASE is_db WHEN 0 THEN 'S' WHEN 1 THEN 'H' END AS FLAG FROM test_data_sovlp WHERE td IS NOT NULL
返回以下数据:
|----------|----------| | DT | FLAG | |----------|----------| | 10 | E | | 20 | H | | 30 | E | | 40 | E | | 50 | E | | 60 | S | | 70 | H | | 75 | E | | 80 | H | | 100 | H | |----------|----------|
针对此表运行时:
|----------|----------|----------|----------|----------| | ID | ESD | TD | IS_DB | TEST_SET | |----------|----------|----------|----------|----------| | 1 | 10 | 20 | 1 | 2 | | 2 | 30 | (null) | 1 | 2 | | 3 | 40 | (null) | 1 | 2 | | 4 | 50 | 60 | 0 | 2 | | 5 | (null) | 70 | 1 | 2 | | 6 | 75 | 100 | 1 | 2 | | 7 | (null) | 80 | 1 | 2 | |----------|----------|----------|----------|----------|
注意 :有关更多详细信息,请参见此处的演示或此处的上一篇文章。
我感兴趣的是FLAG按DT顺序连接上述查询返回的值。
FLAG
DT
因此,对于上面的查询,串联(称为q_result)的值是:q_result = EHEEESEHH。
q_result
q_result = EHEEESEHH
然后,我想q_result按2个字符的块进行解析,以检测以下任何序列的可能存在:
HH EE HS SE
在解析期间,如果模式匹配到任何地方q_result,我想编写的proc必须返回0。如果没有模式匹配,则proc必须返回1。
0
1
问题
如何才能做到这一点 ?
如果我理解正确,则可以执行以下操作:
select count(*) from (select listagg(flag) within group (order by dt) as flags from temp ) x where not regexp_like(flags, 'HH|EE|HS|SE');
另外,您可以使用lag():
lag()
select (case when count(*) = sum(case when flag2 not in ('HH', 'EE', 'HS', 'SE') then 1 else 0 end) as return_value from (select t.*, (lag(flag) over (order by dt) || flag) as flag2 from temp ) t;