Maison >base de données >tutoriel mysql >Comment diviser des chaînes séparées par des virgules en plusieurs lignes dans Oracle ?

Comment diviser des chaînes séparées par des virgules en plusieurs lignes dans Oracle ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-22 17:51:12581parcourir

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

Diviser la chaîne séparée par des virgules en plusieurs lignes dans Oracle

Dans Oracle, vous pouvez diviser une chaîne délimitée par des virgules en plusieurs lignes en utilisant une combinaison d'expressions régulières et de requêtes hiérarchiques. Voici un guide complet sur la façon d'y parvenir :

Énoncé du problème :

Supposons qu'il existe un tableau avec la structure suivante :

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

Vous souhaitez convertir la colonne "erreur" en plusieurs lignes, le résultat est le suivant :

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

Solution :

<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>

Instructions :

  1. Créer une table temporaire : Créez une table TEMP pour stocker les exemples de données.
  2. Utiliser une requête hiérarchique : La sous-requête select level from dual connect by level <= regexp_count(t.error, ',') génère une séquence de nombres dont la longueur est égale au nombre de virgules dans la chaîne plus une (c'est-à-dire le nombre d'erreurs).
  3. Casts et tables : Les fonctions table() et cast() convertissent une requête hiérarchique en une collection de listes numériques puis en un tableau. Cela produira des lignes avec des nombres croissants correspondant à chaque ligne de la table TEMP.
  4. Extraire la valeur d'erreur : La fonction regexp_substr() est utilisée pour extraire une seule valeur d'erreur basée sur le numéro de l'étape précédente. La fonction trim() supprime tout espace de début ou de fin.
  5. Rejoindre et sélectionner : La requête principale joint la table TEMP à la table créée à l'étape 4 et sélectionne les colonnes correspondantes : Nom, Projet et Erreur.

Remarque : Cette solution utilise le type OdciNumberList et peut nécessiter de spécifier des paramètres de compatibilité si vous utilisez une version d'Oracle antérieure à 12c.

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!

Déclaration:
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