오라클 clob 형식의 문자열을 다중구분자(@#&)로 구분하여 행을 분리하는 로직 구현중입니다 0 5 7,742

by SQL [2024.07.26 16:27:11]


오라클 clob 형식의 문자열을 다중구분자(@#&)로 구분하여 행을 분리하는 로직 구현중입니다.

clob 형식의 특성상 가장 긴 데이터의 경우 855만자를 초과하여

테스트 데이터를 만들어서 문의드립니다.

SELECT REGEXP_SUBSTR(a.DATA, '[^@#&]+', 1, b.row_cnt) AS val
  FROM (SELECT '회사코드|A@#&부서코드|AA@#&부서명|R&D센터' DATA FROM DUAL
  UNION ALL
  SELECT '회사코드|C@#&부서코드|CC@#&부서명|기획센터' DATA FROM DUAL) A
     , (SELECT LEVEL row_cnt FROM dual CONNECT BY LEVEL <= 20) b
 WHERE b.row_cnt <= REGEXP_COUNT(a.DATA, '@#&') + 1;

 

질문은

@#& 특수문자 3개를 조합한 컬럼을 구분자로 쓰고있는데, 

이를 활용하여 행분리를 하고자 했는데

@, #, & 중 한개만 들어가도 분리가되고있습니다

도와주세요ㅠㅠ

 

<원하는 결과값>

회사코드|A
회사코드|C
부서코드|AA
부서코드|CC
부서명|R&D센터
부서명|기획센터

<실제 결과값>

회사코드|A
회사코드|C
부서코드|AA
부서코드|CC
부서명|R
부서명|기획센터

by 마농 [2024.07.29 14:50:36]
SET DEFINE OFF;

WITH t AS
(
SELECT 1 pk, '회사코드|A@#&부서코드|AA@#&부서명|R&D센터' data FROM dual
UNION ALL SELECT 2, '회사코드|C@#&부서코드|CC@#&부서명|기획센터' FROM dual
)
-- 사용되지 않는 문자로 변경해서 해보세요. (예 : '@#&' > '♪')
SELECT a.pk
     , b.row_cnt
     , REGEXP_SUBSTR(a.v, '[^♪]+', 1, b.row_cnt) val
  FROM (SELECT pk, REPLACE(data, '@#&', '♪') v FROM t) a
     , (SELECT LEVEL row_cnt FROM dual CONNECT BY LEVEL <= 20) b
 WHERE b.row_cnt <= REGEXP_COUNT(a.v, '[^♪]+')
 ORDER BY pk, row_cnt
;

 


by SQL [2024.07.29 15:28:31]

와...이건 무조건 될거같아요 감사합니다~!

속도개선이 이슈겠네요ㅎㅎ

잘될거같습니다ㅠㅠ감사합니다ㅠㅠㅠ


by SQL [2024.07.29 17:48:08]
WHERE b.row_cnt <= REGEXP_COUNT(a.v, '[^♪]+')

저는 갯수 세는부분이라 REGEXP_COUNT(a.v, '♪')+1로 했었는데

혹시 성능이나 어떤 부분에서 REGEXP_COUNT(a.v, '[^♪]+') 이게 장점이 있어서 바꾸셨을까요??

쿼리 초보라 궁금합니다!!


by 마농 [2024.07.30 10:48:04]

그냥 위아래 같은 조건으로 깔맞춤 하려고 바꿨습니다.
혹시 정규식 때문에 느리다면? 정규식을 빼 보세요.
 WHERE b.row_cnt <= LENGTH(a.v) - LENGTH(REPLACE(a.v, '♪')) + 1


by SQL [2024.07.30 13:45:04]

오늘도 많이배워갑니다ㅠ 감사합니다~!

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