>데이터 베이스 >MySQL 튜토리얼 >Oracle SQL에서 쉼표로 구분된 값을 효율적으로 행으로 변환하려면 어떻게 해야 합니까?

Oracle SQL에서 쉼표로 구분된 값을 효율적으로 행으로 변환하려면 어떻게 해야 합니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-22 18:57:10687검색

How Can I Efficiently Convert Comma-Separated Values into Rows in Oracle SQL?

Oracle SQL의 쉼표 구분 값 변환 전략

데이터베이스 레코드의 데이터를 쉼표로 구분된 값으로 구성하면 표 형식으로 표현하기가 어렵습니다. 이 기사에서는 데이터를 쉽게 추출하고 조작할 수 있도록 이러한 데이터를 행으로 효율적으로 변환하는 몇 가지 SQL 기술을 살펴봅니다.

문제: 데이터베이스 레코드의 쉼표로 구분된 값

값 열에 쉼표로 구분된 값이 포함된 다음 테이블 구조를 고려해 보세요.

<code>CREATE TABLE tbl1 (
  id NUMBER,
  value VARCHAR2(50)
);

INSERT INTO tbl1 VALUES (1, 'AA, UT, BT, SK, SX');
INSERT INTO tbl1 VALUES (2, 'AA, UT, SX');
INSERT INTO tbl1 VALUES (3, 'UT, SK, SX, ZF');</code>

목표는 이 데이터를 표 형식으로 변환하고 각 값을 자체 행으로 구분하는 것입니다.

<code>ID | VALUE
-------------
1  | AA
1  | UT
1  | BT
1  | SK
1  | SX
2  | AA
2  | UT
2  | SX
3  | UT
3  | SK
3  | SX
3  | ZF</code>

방법 1: REGEXP_SUBSTR 및 연결 방법 사용

한 가지 방법은 Oracle의 REGEXP_SUBSTR 및 CONNECT BY 절을 활용하는 것입니다.

<code>SELECT DISTINCT id, TRIM(REGEXP_SUBSTR(value, '[^,]+', 1, level) ) VALUE, LEVEL
FROM tbl1
CONNECT BY REGEXP_SUBSTR(value, '[^,]+', 1, LEVEL) IS NOT NULL
ORDER BY id, LEVEL;</code>

이 방법은 정규식(REGEXP_SUBSTR)을 사용하여 각 하위 문자열을 추출하는 반면, CONNECT BY는 쉼표로 구분된 값을 반복적으로 반복합니다.

방법 2: 재귀적 결합을 이용한 CTE

또 다른 기술은 재귀 공용체와 함께 공통 테이블 표현식(CTE)을 사용하는 것입니다.

<code>WITH t (id, res, val, lev) AS (
  SELECT id, TRIM(REGEXP_SUBSTR(value, '[^,]+', 1, 1)) RES, VALUE AS VAL, 1 AS LEV
  FROM tbl1
  WHERE REGEXP_SUBSTR(VALUE, '[^,]+', 1, 1) IS NOT NULL
  UNION ALL
  SELECT id, TRIM(REGEXP_SUBSTR(VAL, '[^,]+', 1, LEV + 1)) RES, VAL, LEV + 1 AS LEV
  FROM t
  WHERE REGEXP_SUBSTR(VAL, '[^,]+', 1, LEV + 1) IS NOT NULL
)
SELECT id, res, lev
FROM t
ORDER BY id, lev;</code>

이 방법은 재귀 CTE를 사용하여 쉼표로 구분된 값을 개별 요소로 나눕니다.

방법 3: INSTR의 재귀적 방법 사용

세 번째 솔루션은 INSTR 함수와 함께 재귀 CTE를 사용하여 각 하위 문자열의 시작 및 끝 위치를 식별합니다.

<code>WITH t (id, value, start_pos, end_pos) AS
  (SELECT id, VALUE, 1, INSTR(VALUE, ',')
  FROM tbl1
  UNION ALL
  SELECT id,
    VALUE,
    end_pos                    + 1,
    INSTR(VALUE, ',', end_pos + 1)
  FROM t
  WHERE end_pos > 0
  )
SELECT id,
  SUBSTR(VALUE, start_pos, DECODE(end_pos, 0, LENGTH(VALUE) + 1, end_pos) - start_pos) AS VALUE
FROM t
ORDER BY id,
  start_pos;</code>

이 방법은 INSTR을 활용하여 각 하위 문자열의 위치를 ​​재귀적으로 결정하고 그에 따라 추출합니다.

위 내용은 Oracle SQL에서 쉼표로 구분된 값을 효율적으로 행으로 변환하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.