>데이터 베이스 >MySQL 튜토리얼 >DB2 SQL을 사용하여 쉼표로 구분된 열을 행으로 나누는 방법은 무엇입니까?

DB2 SQL을 사용하여 쉼표로 구분된 열을 행으로 나누는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-20 08:40:09356검색

How to Break Down Comma-Separated Columns into Rows Using 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 절을 사용하여 참조를 반복적으로 분할합니다. 열을 개별 값으로 변환:

  • lvl은 재귀를 나타냅니다. 이는 최대 100개 레벨 후에 분할 프로세스가 종료되도록 보장합니다.
  • CTE의 첫 번째 행은 참조 열의 첫 번째 토큰을 참조용 초기 값으로 선택하고 나머지 문자열은
  • 다음 행은 이전 행의 꼬리를 참조로 사용하고 꼬리가 비어 있거나 최대 재귀 수준이 다음과 같을 때까지 분할 프로세스를 반복합니다. 도달했습니다.
  • 마지막으로 CTE 외부의 SELECT 문은 unpivot CTE에서 원하는 ID, fk_ref 및 참조 열을 추출합니다.

참고:

쉼표로 구분된 형식으로 데이터를 저장하지 않는 것이 중요합니다. 무결성 문제가 발생하고 데이터 조작 및 쿼리가 더욱 복잡해집니다. 그러나 제공된 솔루션은 불가피하거나 필요한 경우 이러한 데이터를 보다 관리하기 쉽고 사용하기 쉬운 형식으로 변환하는 방법을 제공합니다.

위 내용은 DB2 SQL을 사용하여 쉼표로 구분된 열을 행으로 나누는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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