clob 데이터 에서 dbms_lob.inser 과 substr 을 이용해서 원하는 부분 추출이 가능할까요? 1 10 3,427

by 김실홍 [2016.08.16 17:27:04]


 

clob 데이터 지만 간소화 시켜서 설명드리자면

 

111111#%2222222222#%33333333#%444444#%

 

clob가 아닌경우 #% 으로 스플릿 해서 간단하게 배열에 넣을수있는데 

 

위데이터가 clob입니다

 

배열에다가 순서데로 #% 로 자른부분만 넣고싶거든요

 

dbms_lob 에 있는 함수를 봐도 방법이 떠오르지 않는데 혹시 구현해보신분 계신지요???

 

 

 

by 마농 [2016.08.17 08:56:06]
WITH t AS
(
SELECT TO_CLOB('111111#%2222222222#%33333333#%444444#%') v FROM dual
)
SELECT lv
     , REGEXP_SUBSTR(v, '[^#%]+', 1, lv) x
  FROM t
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99)
 WHERE lv <= REGEXP_COUNT(v, '[^#%]+')
;

 


by jkson [2016.08.17 09:09:01]

마농님 질문이요~

구분자를 #%로 했잖아요~

그런데 데이터가

WITH t AS
(
SELECT TO_CLOB('111111#%22222#22222#%3333%3333#%444444#%') v FROM dual
)

이런 식이면 #과 %일 때도 구분자로 인식하는 문제가 있어서

생각해보다가 퇴근했는데요. 정규식으로 다른 방법이 있을까요?


by 마농 [2016.08.17 09:25:01]
WITH t AS
(
SELECT 1 idx, TO_CLOB('111111#%2222222222#%33333333#%444444#%') v FROM dual
UNION ALL SELECT 2, TO_CLOB('111111#%22222#22222#%3333%3333#%444444#%') FROM dual
)
SELECT idx
     , lv
     , REGEXP_SUBSTR(REPLACE(v, '#%', '|'), '[^|]+', 1, lv) x
  FROM t
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99)
 WHERE lv <= REGEXP_COUNT(REPLACE(v, '#%', '|'), '[^|]+')
 ORDER BY idx, lv
;

 


by jkson [2016.08.17 09:45:04]

아! 구분자를 하나로 합쳐주는 이런 간단한 방법이;;

dbms_lob 함수를 이용하면 이런 방법으로도 가능은 합니다ㅠ

WITH t AS
(
SELECT TO_CLOB('111111#%22222#22222#%3333%3333#%444444#%') v FROM dual
)
SELECT LV
     , DECODE(LV,1, DBMS_LOB.SUBSTR(V,DBMS_LOB.INSTR(V,'#%',1,LV) - 1, 1)
                  , DBMS_LOB.SUBSTR(V,DBMS_LOB.INSTR(V,'#%',1,LV) 
                  - DBMS_LOB.INSTR(V,'#%',1,LV - 1) - 2, DBMS_LOB.INSTR(V,'#%',1,LV - 1) + 2)) X
  FROM T
     , (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 99)
 WHERE LV <= REGEXP_COUNT(V, '#%')
;

 


by 김실홍 [2016.08.17 10:10:52]

두분다 답변 정말 감사합니다

 

일단 마농님 방법으로 하고있습니다.. 


by 김실홍 [2016.08.17 11:18:33]

하나만 추가로 여쭈어 봅니다 ㅠㅠ

 

'111111#%2222222222#%#%444444#%'

 

데이터와 위와같이 3번쨰가 존재하지 않을경우

 

결과를

 

111111

2222222222

444444

 

실제 split 함수처럼 중간이 비어도 나오게 해줄순 없을까요 ㅠㅠ?

 

도와주세용 !!


by 김실홍 [2016.08.17 11:27:19]

JKSON 님이 달아준 방법되로 하면 일단 됩니다

 

정말 감사드려요 !!


by 마농 [2016.08.17 11:31:47]

맨 뒤에 #% 는 항상 붙나요?
 - 혹시 안 붙을 때도 있다면?
 - 붙을 때는 맨 뒤에도 널값이 한 행 추가되어야 겠네요?


by 김실홍 [2016.08.17 13:26:31]

네 항상 붙습니다.


by 마농 [2016.08.17 13:46:22]
WITH t AS
(
SELECT 1 idx, TO_CLOB('111111#%2222222222#%33333333#%444444#%') v FROM dual
UNION ALL SELECT 2, TO_CLOB('111111#%22222#22222#%3333%3333#%444444#%') FROM dual
UNION ALL SELECT 3, TO_CLOB('111111#%2222222222#%#%444444#%') FROM dual
)
SELECT idx
     , lv
     , SUBSTR(v
       , INSTR('#%'||v, '#%', 1, lv)
       , INSTR(      v, '#%', 1, lv)
       - INSTR('#%'||v, '#%', 1, lv)
       ) x
  FROM t
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99)
 WHERE lv <= REGEXP_COUNT(v, '#%')
 ORDER BY idx, lv
;

 

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