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

时间:2018-05-20 10:35:44

标签: sql stored-procedures oracle11g

以下查询

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

注意 :有关详细信息,请参阅演示here或我之前的帖子here

我感兴趣的是按FLAG顺序连接上述查询的DT值。

因此,对于上面的查询,连接(我们称之为q_result)值为:q_result = EHEEESEHH

我希望然后用2个字符的块解析q_result,以检测是否存在以下任何序列:

HH      EE      HS      SE

在解析期间,如果模式匹配q_result中的任何位置,我想写的proc必须返回0。 如果没有模式匹配,那么proc必须返回1

问题

如何做到这一点?

1 个答案:

答案 0 :(得分:3)

如果我理解正确,你可以这样做:

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;