집 >데이터 베이스 >MySQL 튜토리얼 >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>
지침:
select level from dual connect by level <= regexp_count(t.error, ',')
는 문자열의 쉼표 수에 1을 더한 길이의 숫자 시퀀스를 생성합니다(예: 오류 수). table()
및 cast()
함수는 계층적 쿼리를 숫자 목록 모음으로 변환한 다음 테이블로 변환합니다. 그러면 TEMP 테이블의 각 행에 해당하는 숫자가 증가하는 행이 생성됩니다. regexp_substr()
함수는 이전 단계의 숫자를 기반으로 단일 오류 값을 추출하는 데 사용됩니다. trim()
함수는 선행 또는 후행 공백을 제거합니다. 참고: 이 솔루션은 OdciNumberList 유형을 사용하며 12c 이전 Oracle 버전을 사용하는 경우 호환성 설정을 지정해야 할 수 있습니다.
위 내용은 Oracle에서 쉼표로 구분된 문자열을 여러 행으로 분할하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!