split 관련 질문드립니다. 1 3 5,577

by 짱구 [SQL Query] query split function type [2011.03.31 09:42:26]


안녕하세요
잘 풀리지 않아 질문드립니다.
제가 하고 싶은건 아래와 같이

table name: TB_JOB
   code    str
AB00001   ABC,DEF
AB00023   ABC,DEF
AC09834   DEF,GHI
AD98340   ABC,GHI

있을때

AB00001   ABC
AB00023   ABC
AD98340   ABC
AB00001   DEF
AB00023   DEF
AC09834   DEF
AC09834   GHI
AD98340   GHI

와 같이 하고 싶습니다.


우선 제가 찾은건 type과 fuction를 만들어서 분리 하는건 찾았는데
응용해봐도 잘 안되네요.
------------------------------------------------------------------------------------------------------------------------
create or replace type split_tbl as table ofvarchar2(32767);
create or replace function split
(
p_list varchar2,
    p_del varchar2 := ','
) return split_tbl pipelined
is
l_idx pls_integer;
l_list varchar2(32767):= p_list;
AA
l_value varchar2(32767);
begin
loop
l_idx :=instr(l_list,p_del);
if l_idx > 0then
piperow(substr(l_list,1,l_idx-1));
l_list:= substr(l_list,l_idx+length(p_del));

else
piperow(l_list);
exit;
end if;
end loop;
return;
end split;

SQL> SELECT ROWNUM, COLUMN_VALUE FROM TABLE(split('one,two,three'));
rownum column_value
    1   one
    2  two
    3  three
------------------------------------------------------------------------------------------------------------------------
by 마농 [2011.03.31 10:32:42]
WITH tb_job AS
(
SELECT 'AB00001' code, 'ABC,DEF' str FROM dual
UNION ALL SELECT 'AB00023', 'ABC,DEF' FROM dual
UNION ALL SELECT 'AC09834', 'DEF,GHI' FROM dual
UNION ALL SELECT 'AD98340', 'ABC,GHI' FROM dual
)
SELECT code
, REGEXP_SUBSTR(str, '[^,]+', 1, lv) str
FROM tb_job
, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9)
WHERE lv <= LENGTH(str) - LENGTH(REPLACE(str, ',')) + 1
ORDER BY str, code
;

by 짱구 [2011.03.31 10:56:38]
감사합니다.

구지 function를 쓰지 않아도 되는군요.

by guramoto [2018.09.04 10:16:14]

##### split #####

마농님 덕분에 많이 배우네요.

감사합니다.

 

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