我有一个字符串,如下所示
[["","","2","1","1","1","1","0","0","0","0","0"],["","","0","0","0","1","2","3","2","0","0","0"],["","","0","0","1","2","2","1","1","1","2","0"],["","","0","0","0","1","2","2","2","1","0","0"]]
我使用下面的查询将每个列表分解为行
with dataa (d) as
(SELECT '[["","","2","1","1","1","1","0","0","0","0","0"],["","","0","0","0","1","2","3","2","0","0","0"],["","","0","0","1","2","2","1","1","1","2","0"],["","","0","0","0","1","2","2","2","1","0","0"]]' from dual)
select level, '[' || ltrim(ltrim(regexp_substr(d,'[^]]+',1,level) || ']',','),'[') as str
from dataa
connect by level <= regexp_count(d,'\[') - 1;
这是结果:
现在,如果数字大于1,我现在希望每行的计数器值
1 row --> 1
2 row --> 3
.....
.....
您仅需按group by
就可以使用上一个问题中的相同词,如下所示:
with dataa (d) as
(select '[["","","2","1","1","1","1","0","0","0","0","0"],["","","0","0","0","1","2","3","2","0","0","0"],["","","0","0","1","2","2","1","1","1","2","0"],["","","0","0","0","1","2","2","2","1","0","0"]]' from dual)
-- query starts from
SELECT LVL, COALESCE(SUM(CASE WHEN CNTR > 1 THEN 1 END),0) AS CNTR
FROM
(SELECT T.STR, REGEXP_SUBSTR(T.STR, '[0-9]+',1,COLUMN_VALUE) AS CNTR
FROM
(select LTRIM(regexp_substr(d,'[^]]+',1,level),',') as str
from dataa
connect by level <= regexp_count(d,'\[') - 1) T
CROSS JOIN
table(cast(multiset(select level from dual
connect by level <= length (regexp_replace(t.STR, '[^,]+')) + 1)
as sys.OdciNumberList)) levels)
GROUP BY STR;