Maison > base de données > tutoriel mysql > Comment puis-je diviser une chaîne délimitée par des virgules en plusieurs lignes dans Oracle 10g et 11g ?

Comment puis-je diviser une chaîne délimitée par des virgules en plusieurs lignes dans Oracle 10g et 11g ?

Patricia Arquette
Libérer: 2025-01-22 17:56:13
original
635 Les gens l'ont consulté

How Can I Split a Comma-Delimited String into Multiple Rows in Oracle 10g and 11g?

Diviser efficacement les chaînes séparées par des virgules en lignes dans Oracle 10g et 11g

Oracle propose plusieurs méthodes pour diviser les chaînes délimitées par des virgules en lignes individuelles. Cette approche améliorée exploite les expressions régulières et la clause CONNECT BY pour une solution plus efficace :

<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>
Copier après la connexion

Explication détaillée :

Cette requête utilise une requête hiérarchique pour réaliser le fractionnement de la chaîne. Décomposons les étapes :

  1. Exemples de données : La clause WITH définit un exemple de table (temp) contenant des chaînes d'erreur séparées par des virgules.

  2. Nombre de délimiteurs : LENGTH(REGEXP_REPLACE(t.error, '[^,] ')) 1 calcule le nombre de virgules plus une (pour tenir compte du dernier élément). Cela détermine le nombre de lignes nécessaires.

  3. Génération de la séquence : SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= ... génère une séquence de nombres de 1 jusqu'au nombre d'éléments. CONNECT BY est crucial pour créer cette séquence.

  4. Création de collection : MULTISET(...) crée une collection (un ensemble de nombres) à partir de la séquence générée. CAST(... AS OdciNumberList) convertit ceci en un type de collection Oracle.

  5. Transformation de table : TABLE(...) transforme la collection en un ensemble de résultats, nous permettant de la joindre à la table temp.

  6. Extraction de chaîne : REGEXP_SUBSTR(t.error, '[^,] ', 1, levels.column_value) extrait chaque sous-chaîne séparée par des virgules. [^,] est une expression régulière correspondant à un ou plusieurs caractères autres que des virgules. levels.column_value fournit le numéro d'occurrence de l'extraction.

  7. Découpage et déduplication : TRIM(...) supprime les espaces de début et de fin. SELECT DISTINCT élimine les lignes en double, garantissant que chaque erreur n'apparaît qu'une seule fois.

Cette approche est efficace car elle évite les boucles et utilise les fonctions intégrées d'Oracle pour des performances optimisées. L'expression régulière fournit une méthode robuste pour gérer diverses longueurs de chaîne et les irrégularités potentielles dans les données délimitées par des virgules.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal