문제

i have a table in which two fields are id, controlflag.It looks like

Id    CntrlFlag       
121   SSSSSRNNNSSRSSNNR
122   SSSNNRRSSNNRSSSSS           
123   RRSSSNNSSSSSSSSSSSSSSS

I have to get output in the following form( the occurences of R)

Id    Flag
121   6,12,17
122   6,7,12
123   1,2

I tried oracle query( as i obtained from this forum):

select  mtr_id,listagg(str,',') within group (order by lvl) as flags from
 ( select  mtr_id, instr(mtr_ctrl_flags,'R', 1, level) as str, level as lvl             
    from mer_trans_reject           
    connect by level <= regexp_count(mtr_ctrl_flags, 'R'))group by mtr_id;

it gives the result but 2nd and 3rd occurrences(not 1st one) are duplicated a no. of times. it looks like

id   Flag
123 6,12,12,12,12,17,17,17,17,17.

Can anybody know what's wrong here?

올바른 솔루션이 없습니다

다른 팁

It could be avoided by select distinct keyword.Is there any other way?

Yes, there is, but this one is a little bit heavier(distinct will cost you less):

with t1(Id1, CntrlFlag) as(
  select 121, 'SSSSSRNNNSSRSSNNR'      from dual union all
  select 122, 'SSSNNRRSSNNRSSSSS'      from dual union all
  select 123, 'RRSSSNNSSSSSSSSSSSSSSS' from dual
)
select w.id1
     , listagg(w.r_pos, ',') within group(order by w.id1) as R_Positions
  from (select q.id1 
             , regexp_instr(q.CntrlFlag,'R', 1, t.rn) as r_pos
          from t1 q
         cross join (select rownum rn
                       from(select max (regexp_count(CntrlFlag, 'R')) ml
                              from t1
                            )
                           connect by level <= ml      
                      ) t
         ) w  
where w.r_pos > 0                          
group by w.id1

Result:

 ID1        R_POSITIONS
----------  -----------
       121  12,17,6
       122  12,6,7
       123  1,2
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top