Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
with brackets as(select '[[]])[([[]][[(]])]' b
from dual
)
,pivot as (select ord
,br
,decode(br,')',-1,']',-1,'(',1,'[',1) direction
,sum(decode(br,')',-1,']',-1,'(',1,'[',1)) over (order by ord) depth
from (
select level ord,substr(b,level,1) br
from brackets connect by level <= length(b)
)
)
select from_pos
,to_pos
,substr(b,from_pos,to_pos-from_pos+1) data
from (
select s.*
,dense_rank() over (order by from_pos-to_pos) d_rank
from (
select s.*
,sum(error) over (order by to_pos range between to_pos-from_pos preceding and current row) errors
from (
select p1.ord to_pos
,max(p2.ord) from_pos
,decode(translate(max(p1.br),'])','[('),max(p2.br) keep (dense_rank last order by p2.ord),0,1) error
from pivot p1
inner join pivot p2 on p1.depth = p2.depth -1 and p2.ord < p1.ord and p2.direction = 1 and p1.direction = -1
group by p1.ord
)s
)s
where errors = 0
)s,brackets
where s.d_rank = 1;
FROM_POS TO_POS DATA
---------- ---------- ------------------
1 4 [[]]
8 11 [[]]
Считаем скобочки на Oracle SQL