집 >데이터 베이스 >MySQL 튜토리얼 >Oracle 10g 및 11g에서 쉼표로 구분된 문자열을 여러 행으로 분할하려면 어떻게 해야 합니까?
Oracle 10g 및 11g에서 쉼표로 구분된 문자열을 효율적으로 행으로 분할
Oracle은 쉼표로 구분된 문자열을 개별 행으로 분할하는 여러 가지 방법을 제공합니다. 이 향상된 접근 방식은 보다 효율적인 솔루션을 위해 정규식과 CONNECT BY
절을 활용합니다.
<code class="language-sql">WITH temp AS ( SELECT 108 AS Name, 'test' AS Project, 'Err1, Err2, Err3' AS 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 <= LENGTH(REGEXP_REPLACE(t.error, '[^,]+')) + 1) AS OdciNumberList)) levels</code>
자세한 설명:
이 쿼리는 계층적 쿼리를 사용하여 문자열 분할을 달성합니다. 단계를 세분화해 보겠습니다.
샘플 데이터: WITH
절은 쉼표로 구분된 오류 문자열이 포함된 샘플 테이블(temp
)을 정의합니다.
구분자 수: LENGTH(REGEXP_REPLACE(t.error, '[^,] ')) 1
는 쉼표에 1을 더한 수를 계산합니다(마지막 요소를 고려). 이에 따라 필요한 행 수가 결정됩니다.
시퀀스 생성: SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= ...
은 1부터 요소 개수까지의 숫자 시퀀스를 생성합니다. CONNECT BY
은 이 시퀀스를 만드는 데 매우 중요합니다.
컬렉션 생성: MULTISET(...)
생성된 시퀀스에서 컬렉션(숫자 집합)을 생성합니다. CAST(... AS OdciNumberList)
이를 Oracle 컬렉션 유형으로 변환합니다.
테이블 변환: TABLE(...)
은 컬렉션을 결과 집합으로 변환하여 temp
테이블과 결합할 수 있도록 합니다.
문자열 추출: REGEXP_SUBSTR(t.error, '[^,] ', 1, levels.column_value)
은 쉼표로 구분된 각 하위 문자열을 추출합니다. [^,]
은 쉼표가 아닌 문자 하나 이상과 일치하는 정규식입니다. levels.column_value
추출 발생 횟수를 제공합니다.
자르기 및 중복 제거: TRIM(...)
선행/후행 공백을 제거합니다. SELECT DISTINCT
중복 행을 제거하여 각 오류가 한 번만 나타나도록 합니다.
이 접근 방식은 루프를 방지하고 최적화된 성능을 위해 Oracle의 내장 기능을 활용하므로 효율적입니다. 정규식은 다양한 문자열 길이와 쉼표로 구분된 데이터의 잠재적인 불규칙성을 처리하기 위한 강력한 방법을 제공합니다.
위 내용은 Oracle 10g 및 11g에서 쉼표로 구분된 문자열을 여러 행으로 분할하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!