一尘不染

如何将SQL结果存储在变量中并解析结果以识别可能的模式?

sql

下面的查询

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

注意
:有关更多详细信息,请参见此处的演示或此处的上一篇文章。

我感兴趣的是FLAGDT顺序连接上述查询返回的值。

因此,对于上面的查询,串联(称为q_result)的值是:q_result = EHEEESEHH

然后,我想q_result按2个字符的块进行解析,以检测以下任何序列的可能存在:

HH      EE      HS      SE

在解析期间,如果模式匹配到任何地方q_result,我想编写的proc必须返回0。如果没有模式匹配,则proc必须返回1

问题

如何才能做到这一点 ?


阅读 135

收藏
2021-03-17

共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()

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;
2021-03-17