每行中重复该字符串,如果在PLSQL中属性值大于1,则对变量进行计数

问题描述 投票:0回答:1

我有一个字符串,如下所示

[["","","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;

这是结果:

enter image description here

现在,如果数字大于1,我现在希望每行的计数器值

1 row --> 1
2 row --> 3
.....
.....
oracle plsql plsqldeveloper
1个回答
0
投票

您仅需按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;
© www.soinside.com 2019 - 2024. All rights reserved.