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 :
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). 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. 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. 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!