메뉴 건너뛰기

XEDITION

오라클

/*
 #############
 # 문자열 분리 (정규식을 이용한 방식)
 #############
 
 1) 정규식, CONNECT BY 를 이용 SPLIT 방식 분리
  > 구분자에 따라 문자 분리(새로 출력)
*/
WITH TT AS
    (
        SELECT 'AAA,BBB,CCC,DDD.EEE' TXT FROM DUAL
    )
    SELECT TRIM(REGEXP_SUBSTR(TXT, '[^,]+', 1, LEVEL)) AS TXT 
        FROM TT
        CONNECT BY INSTR(TXT, ',', 1, LEVEL - 1) > 0
;
 
TXT
---------------------------
AAA
BBB
CCC
DDD.EEE
---------------------------
 
 
/*
 2) 정규식, 기타 함수를 이용 SPLIT 방식 분리
 > 구분자에 따라 문자 분리(새로 출력)
*/
 WITH T AS
        (
         SELECT 'AAA,BBB,CCC,DDD.EEE'||',' AS TXT FROM DUAL -- 끝자리에 ||',' 추가
        )
        SELECT REPLACE(TXT, ',', '') AS TXT
         FROM   T
          MODEL
           RETURN UPDATED ROWS
           PARTITION BY(ROWNUM RN)
           DIMENSION BY (0 POSITION)
           MEASURES (TXT ,NVL(LENGTH(REGEXP_REPLACE(TXT,'[^,]+','')),0) NB_MOT)
           RULES
           (TXT[FOR POSITION FROM  1 TO NB_MOT[0] INCREMENT 1] 
                = REGEXP_SUBSTR(TXT[0],'[^,]+',1,CV(POSITION)))
;             
 
TXT
---------------------------
AAA
BBB
CCC
DDD.EEE
---------------------------

 

---------------------------------- funtion을 이용한 방식 --------------------------------

1. Row 형식의 Type 선언

Create or Replace Type _Split_Row as Object (Item Varchar2(4000)) ;

 

2. Table 형식의 Type 선언

Create or Replace Type _Split_Table as Table of _Split_Row ;

 

3. Table 전환 Function

Create or Replace Function fn_Split_STR (

    p_String in varchar2,

    p_Delimeter in varchar2 )

Return _Split_Table 

AS

    v_Table _Split_Table := _Split_Table() ;

    n_Start number :=1 ;

    n_Pos := 0;

Begin

    -- Delimeter 로 첫번째 분리

    n_Pos := Instr(p_String, p_Delimeter, n_Start);

    -- Array에 추가

    While (n_Pos != 0) Loop

        v_Table.Extend ;

        v_Table(v_Table.Count) := _Split_Row(Substr(p_String, n_Start, n_Pos - n_Start);

        n_Start := n_Pos + 1 ;

        n_Pos := Instr(p_String, p_Delimeter, n_Start) ;

    End Loop;

    v_Table.Extend;

    v_Table(v_Table.Count) := _Split_Row(Substr(p_String, n_Start)) ;

    Return v_Table ;

End ;

 

위 function 활용 방법

Select Replace(ITEM, ' ', '') -- 공백제거

From Table( Case( fn_Split_STR('1,2,3,4,5', ',') as _Split_Table)) ;

 

결과 

ITEM
1
2
3
4
5

 

 

 

위로