>데이터 베이스 >MySQL 튜토리얼 >Oracle 10g 및 11g에서 쉼표로 구분된 문자열을 여러 행으로 분할하려면 어떻게 해야 합니까?

Oracle 10g 및 11g에서 쉼표로 구분된 문자열을 여러 행으로 분할하려면 어떻게 해야 합니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-22 17:56:13640검색

How Can I Split a Comma-Delimited String into Multiple Rows in Oracle 10g and 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>

자세한 설명:

이 쿼리는 계층적 쿼리를 사용하여 문자열 분할을 달성합니다. 단계를 세분화해 보겠습니다.

  1. 샘플 데이터: WITH 절은 쉼표로 구분된 오류 문자열이 포함된 샘플 테이블(temp)을 정의합니다.

  2. 구분자 수: LENGTH(REGEXP_REPLACE(t.error, '[^,] ')) 1는 쉼표에 1을 더한 수를 계산합니다(마지막 요소를 고려). 이에 따라 필요한 행 수가 결정됩니다.

  3. 시퀀스 생성: SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= ...은 1부터 요소 개수까지의 숫자 시퀀스를 생성합니다. CONNECT BY은 이 시퀀스를 만드는 데 매우 중요합니다.

  4. 컬렉션 생성: MULTISET(...) 생성된 시퀀스에서 컬렉션(숫자 집합)을 생성합니다. CAST(... AS OdciNumberList) 이를 Oracle 컬렉션 유형으로 변환합니다.

  5. 테이블 변환: TABLE(...)은 컬렉션을 결과 집합으로 변환하여 temp 테이블과 결합할 수 있도록 합니다.

  6. 문자열 추출: REGEXP_SUBSTR(t.error, '[^,] ', 1, levels.column_value)은 쉼표로 구분된 각 하위 문자열을 추출합니다. [^,] 은 쉼표가 아닌 문자 하나 이상과 일치하는 정규식입니다. levels.column_value 추출 발생 횟수를 제공합니다.

  7. 자르기 및 중복 제거: TRIM(...) 선행/후행 공백을 제거합니다. SELECT DISTINCT 중복 행을 제거하여 각 오류가 한 번만 나타나도록 합니다.

이 접근 방식은 루프를 방지하고 최적화된 성능을 위해 Oracle의 내장 기능을 활용하므로 효율적입니다. 정규식은 다양한 문자열 길이와 쉼표로 구분된 데이터의 잠재적인 불규칙성을 처리하기 위한 강력한 방법을 제공합니다.

위 내용은 Oracle 10g 및 11g에서 쉼표로 구분된 문자열을 여러 행으로 분할하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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