집 >데이터 베이스 >MySQL 튜토리얼 >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>
한 가지 방법은 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는 쉼표로 구분된 값을 반복적으로 반복합니다.
또 다른 기술은 재귀 공용체와 함께 공통 테이블 표현식(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를 사용하여 쉼표로 구분된 값을 개별 요소로 나눕니다.
세 번째 솔루션은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!