오라클 칼럼의 엔터값 구분으로 나누는 방법 문의 0 6 2,614

by 고수로. [Oracle 기초] [2019.03.12 12:50:53]


안녕하세요. 기술적으로 가능한지 문의 드립니다.

A라는 테이블의 COL1 컬럼 (varchar2)의 데이터 1로우이며 값은 아래와 같습니다.

COL1

HELLOW

ORACLE

TEST

 

즉 위 와 같이 개행문자가 들어있는 칼럼을 split? 형태로 분기해서 따로 나눌수 있을까요.

COL1 SPLIT1 SPLIT2 SPLT3

HELLOW

ORACLE

TEST

HELLOW ORACLE TEST

 

 

by 이준환 [2019.03.12 13:17:01]
/*
1. 오라클 정규표현식함수을 이용한 문자열 분리
2. 오라클 문자열 관련 single-row function을 이용한 문자열 분리
2019.03.12, Jun H. Lee
*/
SELECT
  COL1
, REGEXP_SUBSTR(COL1, '([^'||DELIMITER||']*)(\'||DELIMITER||'|$)', 1, 1, NULL, 1) AS REGEXP_SPLIT1
, REGEXP_SUBSTR(COL1, '([^'||DELIMITER||']*)(\'||DELIMITER||'|$)', 1, 2, NULL, 1) AS REGEXP_SPLIT2
, REGEXP_SUBSTR(COL1, '([^'||DELIMITER||']*)(\'||DELIMITER||'|$)', 1, 3, NULL, 1) AS REGEXP_SPLIT3
, REGEXP_SUBSTR(COL1, '([^'||DELIMITER||']*)(\'||DELIMITER||'|$)', 1, 4, NULL, 1) AS REGEXP_SPLIT4
, REGEXP_SUBSTR(COL1, '([^'||DELIMITER||']*)(\'||DELIMITER||'|$)', 1, 5, NULL, 1) AS REGEXP_SPLIT5
, SUBSTR(COL1, 1, INSTR(COL1, DELIMITER, 1, 1)-1) AS FUNCION_SPLIT1
, SUBSTR(COL1, INSTR(COL1, DELIMITER, 1, 1)+1, INSTR(COL1, DELIMITER, 1, 2)-INSTR(COL1, DELIMITER, 1, 1)-1) AS FUNCION_SPLIT2
, SUBSTR(COL1, INSTR(COL1, DELIMITER, 1, 2)+1, INSTR(COL1, DELIMITER, 1, 3)-INSTR(COL1, DELIMITER, 1, 2)-1) AS FUNCION_SPLIT3
, SUBSTR(COL1, INSTR(COL1, DELIMITER, 1, 3)+1, INSTR(COL1, DELIMITER, 1, 4)-INSTR(COL1, DELIMITER, 1, 3)-1) AS FUNCION_SPLIT4
, SUBSTR(COL1, INSTR(COL1, DELIMITER, 1, 4)+1, LENGTH(COL1)-INSTR(COL1, DELIMITER, 1, 4)) AS FUNCION_SPLIT5
FROM (SELECT 'TEST1
TEST2
TEST3
TEST4
TEST5
' AS COL1
, CHR(10) AS DELIMITER
FROM DUAL
)
;

 


by 마농 [2019.03.12 13:26:54]
WITH t AS
(
SELECT 'HELLOW
ORACLE
TEST
' col1 FROM dual
)
SELECT col1
     , REGEXP_SUBSTR(col1, '.+', 1, 1) split1
     , REGEXP_SUBSTR(col1, '.+', 1, 2) split2
     , REGEXP_SUBSTR(col1, '.+', 1, 3) split3
     , REGEXP_SUBSTR(col1, '.+', 1, 4) split4
  FROM t
;

 


by 이준환 [2019.03.12 13:44:25]
WITH t AS
(
SELECT 'HELLOW
ORACLE
TEST
' col1 FROM dual
UNION ALL
SELECT 'HELLOW

TEST
' col1 FROM dual
)
SELECT col1
     , REGEXP_SUBSTR(col1, '.+', 1, 1) split1
     , REGEXP_SUBSTR(col1, '.+', 1, 2) split2
     , REGEXP_SUBSTR(col1, '.+', 1, 3) split3
     , REGEXP_SUBSTR(col1, '.+', 1, 4) split4
  FROM t
;

ETL등 실무 적용 시, 분리된 문자열이 NULL인 경우에 대한 대비가 필요합니다.
아닐 경우, 필드값이 앞으로 밀리는 결과가 발생할 수 있습니다.


by 고수로. [2019.03.13 12:34:41]

말씀주신 NULL 인경우의 대비에 대한 방법이 무엇이이을까요...ㅜ.ㅜ..

밀리는 현상이 발견되었네요...


by 이준환 [2019.03.13 15:39:04]

제가 처음 올려드린 구문에 이미 대응되어 있을 겁니다. ^_^


by 고수로. [2019.03.12 13:58:10]

답변 주신분들 감사의 인사를 드립니다.

도움이 많이되었습니다.

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