Scinde une chaîne en fonction de l'espace et le caractère délimiteur dans Oracle avec regexp_substr
Je suis en train de découper une chaîne avec regexp_subtr, mais je ne peux pas le faire fonctionner.
Donc, d'abord, j'ai cette requête
select regexp_substr('Helloworld - test!' ,'[[:space:]]-[[:space:]]') from dual
qui très gentiment extraits de mon délimiteur - vide-vide
Mais ensuite, quand j'essaie de fractionner la chaîne avec cette option, il ne fonctionne tout simplement pas.
select regexp_substr('Helloworld - test!' ,'[^[[:space:]]-[[:space:]]]+')from dual
La requête ne retourne rien.
Aide sera très appréciée!
Grâce
- Qu'est-ce que ur les résultats attendus? seul le délimiteur?
- Eh bien, le résultat devrait par "Helloworld". Mais il est important que le délimiteur sera " - ", parce que je veux obtenir le reste de la chaîne "test" avec ", sélectionnez regexp_substr('Helloworld - test!' ,'[^[[:space:]]-[[:space:]]]+',1,2)"
- Oups désolé..je ne suis pas encore. U ne voulez obtenir la valeur avant le délimiteur ou après le délimiteur ou le délimiteur??
- ok, donc j'ai cette requête, et le résultat que je veux. "sélectionnez regexp_substr('Helloworld - test!' ,'[^[[:space:]]-[[:space:]]]+'), sélectionnez regexp_substr('Helloworld - test!' ,'[^[[:space:]]-[[:space:]]]+',1,2) de double" et les résultats devraient être "Helloworld" comme la colonne 1 et "test" colonne2. Mon problème est que je ne sais pas comment définir le séparateur d'être "de l'espace - de l'espace". il fonctionne parfaitement si je n'utilise que "-", mais j'ai vraiment besoin d'un "espace-de l'espace" comme délimiteur. par exemple "select regexp_substr('Helloworld - test!' ,'[^-]+')de double" fonctionnent très bien, mais je veux ajouter de l'espace(vide) à la delimter
Vous devez vous connecter pour publier un commentaire.
SQL Violon
Oracle 11g R2 Schéma d'Installation:
Requête 1:
Résultats:
Si j'ai bien compris, cela va vous aider. Actuellement vous êtes l'obtention de la sortie comme
Helloworld
(avec un espace à la fin). Donc, je suppose que tu ne veux pas avoir de l'espace à la fin. Si oui, vous pouvez tout simplement utiliser l'espace dans le séparateur aussi.U comme mentionné dans le commentaire ur si tu veux deux colonnes de sortie avec
Helloworld
ettest!
. vous pouvez effectuer les opérations suivantes.Essayer de nier le match de la chaîne
'[[:space:]]-[[:space:]]'
en le mettant dans une classe de caractère avec un accent circonflexe (^) pour annuler cela ne fonctionnera pas. Tout ce qui est entre une paire de crochets est traitée comme une liste d'option caractères sauf pour les nommé nommé classes de personnages qui se dilatent à une liste de caractères facultatifs, toutefois, en raison de la façon dont les classes de caractères nid, il est très probable que votre extérieur crochets sont interprétées comme suit:[^[[:space:]]
Un seul espace non non gauche crochet caractère-
suivi par un seul trait d'union[[:space:]]
suivi d'un seul caractère espace]+
suivie par 1 ou plusieurs de fermeture crochets.Il peut être plus facile de convertir votre multi-caractère séparateur à un seul personnage avec regexp_replace, puis utilisez regex_substr pour vous trouver des pièces individuelles:
Dans ce code, je l'ai d'abord changé
-
àchr(11)
. C'est le code ASCII du caractère tabulation verticale (VT) caractère de ce qui est peu probable à apparaître dans la plupart des chaînes de texte. Le match de l'expression de la regexp_substr correspond à tous les non VT caractères suivis par un caractère VT ou la fin de la ligne. Seule la non VT personnages sont retournés (la première sous-expression).Légère amélioration sur MT0 de réponse. Dynamique de comptage à l'aide de regexp_count et prouve qu'il gère les valeurs null où le format de [^délimiteur]+ comme un modèle ne gère PAS NULL éléments de la liste. Plus d'infos à ce sujet ici: Split séparation par virgule valeurs pour les colonnes
CONNECT BY
dans la requête principale sera beau travail pour une seule entrée de ligne, mais vous donnera des résultats erronés si vous essayez d'effectuer des requêtes sur plusieurs lignes d'entrée. J'ai mis à jour ma réponse avec une version prenant en charge plusieurs lignes.