Oracle 데이터베이스에서 문자열을 특정 구분자로 나눌 때는 다양한 방법을 활용할 수 있습니다. REGEXP_SUBSTR
, INSTR
, SUBSTR
같은 기본 함수는 물론, CONNECT BY LEVEL
또는 XMLTABLE
같은 고급 기법도 활용할 수 있습니다. 이 글에서는 Oracle 문자열 Split을 구현하는 방법과 실제 예제를 단계별로 소개하겠습니다.
1. REGEXP_SUBSTR를 사용한 문자열 Split
REGEXP_SUBSTR
는 Oracle에서 정규식을 활용해 문자열을 Split하는 대표적인 함수입니다. 주로 쉼표, 세미콜론 등 구분자로 나뉜 데이터를 간편하게 추출할 수 있습니다.
예제 1: 쉼표로 구분된 문자열을 분리
SELECT
REGEXP_SUBSTR('apple,banana,grape', '[^,]+', 1, 1) AS part1,
REGEXP_SUBSTR('apple,banana,grape', '[^,]+', 1, 2) AS part2,
REGEXP_SUBSTR('apple,banana,grape', '[^,]+', 1, 3) AS part3
FROM DUAL;
출력 결과:
part1 | part2 | part3 |
---|---|---|
apple | banana | grape |
2. 문자열을 여러 행으로 Split하기
Oracle에서는 계층형 쿼리를 활용하여 하나의 문자열을 여러 행으로 나누는 Split 방법도 많이 사용됩니다.
예제 2: 쉼표로 구분된 값을 행으로 변환
WITH DATA AS (
SELECT 'apple,banana,grape' AS str FROM DUAL
)
SELECT
REGEXP_SUBSTR(str, '[^,]+', 1, LEVEL) AS split_value
FROM DATA
CONNECT BY LEVEL <= LENGTH(str) - LENGTH(REPLACE(str, ',', '')) + 1;
출력 결과:
split_value |
---|
apple |
banana |
grape |
TIP: LENGTH
와 REPLACE
를 사용하여 구분자(쉼표)의 개수를 계산해 반복 횟수를 설정합니다.
3. INSTR과 SUBSTR로 문자열 Split하기
INSTR
과 SUBSTR
는 REGEXP_SUBSTR이 제공되지 않는 구 버전의 Oracle에서도 사용할 수 있는 방법입니다.
예제 3: 첫 번째 값 추출
SELECT
SUBSTR('apple,banana,grape', 1, INSTR('apple,banana,grape', ',') - 1) AS first_part
FROM DUAL;
출력 결과:
first_part |
---|
apple |
예제 4: 나머지 값 추출
SELECT
SUBSTR('apple,banana,grape', INSTR('apple,banana,grape', ',') + 1) AS remaining_part
FROM DUAL;
출력 결과:
remaining_part |
---|
banana,grape |
4. 사용자 정의 함수를 활용한 문자열 Split
복잡한 문자열 처리가 필요하거나 반복적으로 사용해야 할 경우, PL/SQL로 사용자 정의 함수를 만드는 것이 효율적입니다.
예제 5: 문자열 Split을 위한 사용자 정의 함수
CREATE OR REPLACE FUNCTION SPLIT_STRING(p_string IN VARCHAR2, p_delimiter IN VARCHAR2, p_part IN NUMBER)
RETURN VARCHAR2 IS
v_result VARCHAR2(4000);
BEGIN
SELECT REGEXP_SUBSTR(p_string, '[^' || p_delimiter || ']+', 1, p_part)
INTO v_result
FROM DUAL;
RETURN v_result;
END;
/
사용 예제
SELECT SPLIT_STRING('apple,banana,grape', ',', 2) AS second_part FROM DUAL;
출력 결과:
second_part |
---|
banana |
5. XMLTABLE을 활용한 문자열 Split
XMLTABLE
을 사용하면 문자열을 XML 형태로 변환하여 행 단위로 데이터를 추출할 수 있습니다.
예제 6: XMLTABLE로 쉼표 구분 값을 행으로 변환
SELECT *
FROM XMLTABLE(
('"' || REPLACE('apple,banana,grape', ',', '","') || '"')
COLUMNS value VARCHAR2(100) PATH '.'
);
출력 결과:
VALUE |
---|
apple |
banana |
grape |
결론: 어떤 Split 방법을 선택할까?
- 간단한 작업:
REGEXP_SUBSTR
또는SUBSTR
과INSTR
사용. - 여러 행으로 변환:
CONNECT BY LEVEL
또는XMLTABLE
활용. - 반복적 사용: 사용자 정의 함수 작성.
Oracle에서 문자열 Split은 데이터 처리 상황에 따라 다양한 방법을 활용할 수 있습니다. 필요에 맞는 최적의 방법을 선택하세요!