listagg 반대로 적용하기 4

by 김또스 [SQL Query] [2024.01.18 08:19:36]


안녕하세요.

1 A,B,C
2 D

위에 데이터를 아래처럼 변환이 가능할가요?

1 A
1 B
1 C
2 D

listagg 반대 개념으로 생각해주시면 될 것 같습니다.

by pajama [2024.01.18 09:34:13]

안녕하세요. 주로 regexp_substr을 사용하는 것 같습니다.

 

with t (c1, c2) as (
select 1, 'A,B,C' from dual union all
select 2, 'D' from dual
)
SELECT DISTINCT c1,
  REGEXP_SUBSTR(c2, '[^,]+', 1, level) AS part
FROM t
CONNECT BY REGEXP_SUBSTR(c2, '[^,]+', 1, level) IS NOT NULL
ORDER BY c1

 


by 마농 [2024.01.18 09:59:24]

행 복제를 위해 Connect By 를 사용하는 방법은
테이블에 직접 적용하면 안됩니다.
원치 않는 수량의 데이터가 발생되어 성능이 저하됩니다.
이게 자료가 몇건 없으면 이렇게 중복제거를 통해 결과가 나오긴 하지만
건수가 많으면 성능이 엄청나게 저하되게 됩니다.
http://gurubee.net/article/55635
 

WITH t AS
(
SELECT 1 id, 'A,B,C' v  FROM dual
UNION ALL SELECT 2, 'D' FROM dual
)
SELECT id
     , lv
     , REGEXP_SUBSTR(v, '[^,]+', 1, lv) x
  FROM t
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9)
 WHERE lv <= REGEXP_COUNT(v, '[^,]+')
 ORDER BY id, lv
;

 


by pajama [2024.01.18 10:43:24]

조언 감사드립니다.


by 김또스 [2024.01.18 15:06:40]

몇일간 고민했었는데, 정말 감사합니다^^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입