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
Libérer: 2025-01-22 17:51:12
original
505 Les gens l'ont consulté

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

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

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

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!

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