>데이터 베이스 >MySQL 튜토리얼 >Oracle에서 쉼표로 구분된 문자열을 여러 행으로 분할하는 방법은 무엇입니까?

Oracle에서 쉼표로 구분된 문자열을 여러 행으로 분할하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-22 17:51:12560검색

How to Split Comma-Separated Strings into Multiple Rows in Oracle?

Oracle에서 쉼표로 구분된 문자열을 여러 줄로 분할

Oracle에서는 정규 표현식과 계층적 쿼리를 조합하여 쉼표로 구분된 문자열을 여러 줄로 나눌 수 있습니다. 이를 달성하는 방법에 대한 전체 가이드는 다음과 같습니다.

문제 설명:

다음과 같은 구조의 테이블이 있다고 가정해 보겠습니다.

<code>名称 | 项目 | 错误
--------------
108  | test    | Err1, Err2, Err3
109  | test2   | Err1</code>

"오류" 열을 여러 행으로 변환하려는 경우 결과는 다음과 같습니다.

<code>名称 | 项目 | 错误
--------------
108  | test    | Err1
108  | test    | Err2
108  | test    | Err3
109  | test2   | Err1</code>

해결책:

<code class="language-sql">with temp as (
    select 108 Name, 'test' Project, 'Err1, Err2, Err3' Error  from dual
    union all
    select 109, 'test2', 'Err1' from dual
)
select distinct
  t.name, t.project,
  trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value))  as error
from 
  temp t,
  table(cast(multiset(select level from dual connect by  level <= regexp_count(t.error, ',')) as OdciNumberList)) levels
;</code>

지침:

  1. 임시 테이블 생성: 샘플 데이터를 저장할 TEMP 테이블을 생성합니다.
  2. 계층적 쿼리 사용: 하위 쿼리 select level from dual connect by level <= regexp_count(t.error, ',')는 문자열의 쉼표 수에 1을 더한 길이의 숫자 시퀀스를 생성합니다(예: 오류 수).
  3. 캐스트 및 테이블: table()cast() 함수는 계층적 쿼리를 숫자 목록 모음으로 변환한 다음 테이블로 변환합니다. 그러면 TEMP 테이블의 각 행에 해당하는 숫자가 증가하는 행이 생성됩니다.
  4. 오류 값 추출: regexp_substr() 함수는 이전 단계의 숫자를 기반으로 단일 오류 값을 추출하는 데 사용됩니다. trim() 함수는 선행 또는 후행 공백을 제거합니다.
  5. 조인 및 선택: 기본 쿼리는 TEMP 테이블을 4단계에서 생성된 테이블과 조인하고 해당 열(이름, 프로젝트 및 오류)을 선택합니다.

참고: 이 솔루션은 OdciNumberList 유형을 사용하며 12c 이전 Oracle 버전을 사용하는 경우 호환성 설정을 지정해야 할 수 있습니다.

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

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