집 >데이터 베이스 >MySQL 튜토리얼 >DB2 SQL을 사용하여 쉼표로 구분된 열을 행으로 나누는 방법은 무엇입니까?
DB2를 사용하여 쉼표로 구분된 열을 행으로 분할
데이터베이스 관리 영역에서 쉼표로 구분된 값을 처리하면 종종 문제가 발생할 수 있습니다. 특히 개별 값을 별도의 행으로 추출하는 경우 더욱 그렇습니다. 그러한 시나리오 중 하나는 테이블에 쉼표로 구분된 참조가 있는 열이 포함되어 있고 이러한 참조를 개별 행으로 분할해야 하는 경우에 발생합니다.
문제 설명
다음을 고려하십시오. 다음 구조의 테이블:
Id | FK_ID | Reference ----------------------- 1 | 2100 | GI2, GI32 2 | 2344 | GI56
목표는 이 데이터를 다음과 같은 원하는 형태로 변환하는 것입니다. 출력:
Id | FK_ID | Reference ----------------------- 1 | 2100 | GI2 2 | 2100 | GI32 3 | 2344 | GI56
DB2 솔루션
이 데이터 변환을 달성하기 위해 DB2는 쉼표로 구분된 값을 개별 행으로 반복적으로 분할하는 재귀 SQL 문을 제공합니다. 솔루션은 다음 SQL 코드를 활용합니다.
WITH unpivot (lvl, id, fk_ref, reference, tail) AS ( SELECT 1, id, fk_ref, CASE WHEN LOCATE(',',reference) > 0 THEN TRIM(LEFT(reference, LOCATE(',',reference)-1)) ELSE TRIM(reference) END, CASE WHEN LOCATE(',',reference) > 0 THEN SUBSTR(reference, LOCATE(',',reference)+1) ELSE '' END FROM yourtable UNION ALL SELECT lvl + 1, id, fk_ref, CASE WHEN LOCATE(',', tail) > 0 THEN TRIM(LEFT(tail, LOCATE(',', tail)-1)) ELSE TRIM(tail) END, CASE WHEN LOCATE(',', tail) > 0 THEN SUBSTR(tail, LOCATE(',', tail)+1) ELSE '' END FROM unpivot WHERE lvl < 100 AND tail != '') SELECT id, fk_ref, reference FROM unpivot
설명
unpivot이라는 이 재귀 CTE(공통 테이블 표현식)는 UNION ALL 절을 사용하여 참조를 반복적으로 분할합니다. 열을 개별 값으로 변환:
참고:
쉼표로 구분된 형식으로 데이터를 저장하지 않는 것이 중요합니다. 무결성 문제가 발생하고 데이터 조작 및 쿼리가 더욱 복잡해집니다. 그러나 제공된 솔루션은 불가피하거나 필요한 경우 이러한 데이터를 보다 관리하기 쉽고 사용하기 쉬운 형식으로 변환하는 방법을 제공합니다.
위 내용은 DB2 SQL을 사용하여 쉼표로 구분된 열을 행으로 나누는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!