Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment diviser une chaîne dans Oracle

Problème :

Vous souhaitez fractionner une chaîne dans Oracle.

Exemple :

Vous avez une phrase et vous aimeriez la diviser par le caractère espace.

Solution :

SELECT
REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) AS parts
FROM dual
CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL;

Le tableau de résultats ressemble à ceci :

parties
Un
exemple
phrase.

Discussion :

Pour obtenir des sous-chaînes à partir d'une chaîne, vous pouvez utiliser la fonction intégrée REGEXP_SUBSTR() d'Oracle. Il prend quatre arguments :

  • La chaîne à rechercher pour une sous-chaîne.
  • L'expression régulière ; c'est-à-dire le modèle que vous aimeriez trouver.
  • La position à laquelle vous souhaitez commencer à rechercher le modèle (la valeur par défaut est 1, ce qui signifie en commençant par le début de la chaîne).
  • Le nombre spécifiant l'occurrence de la sous-chaîne correspondante que vous souhaitez voir (la valeur par défaut est 1 , ce qui signifie que la première sous-chaîne correspondante doit être affichée).

Dans notre exemple, la chaîne à rechercher est 'An example sentence. ' Dans la chaîne, vous recherchez des sous-chaînes qui sont des mots, que nous définissons ici comme n'importe quel groupe de caractères à l'exception des espaces. C'est pourquoi nous spécifions le motif '[^ ]+ ', c'est-à-dire toute séquence de caractères autres que des espaces. [^ ] représente n'importe quel caractère sauf l'espace, et le + signe représente une ou plusieurs occurrences de ces caractères. Le troisième argument doit être la valeur par défaut (1 ), car vous souhaitez rechercher des mots dans toute la chaîne depuis le début. Le dernier argument est le plus délicat - vous avez besoin que sa valeur change pour chaque chaîne à rechercher. Il doit être de niveau - une pseudo-colonne disponible dans les requêtes hiérarchiques utilisant CONNECT BY – qui, dans notre cas, sera égal au numéro de ligne de la ligne courante dans le résultat lorsque CONNECT BY est utilisé. Donc, vous avez :

REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level)

Cette expression doit être sélectionnée parmi dual – une pseudotable utilisée dans Oracle lorsque vous ne sélectionnez pas dans une table réelle. Ensuite, vous devez CONNECT BY l'opérateur de requêtes hiérarchiques, à condition que la sous-chaîne récupérée ne soit pas NULL . La sous-chaîne récupérée sera NULL une fois tous les mots récupérés ; la requête hiérarchique stoppera alors l'exécution. Donc, vous avez :

FROM dual CONNECT BY REGEXP_SUBSTR('An example sentence.', '[^ ]+', 1, level) IS NOT NULL

Vous pouvez lire ici sur le niveau et CONNECT BY.

Si vous souhaitez diviser la chaîne par un autre délimiteur, vous pouvez facilement modifier la requête. Par exemple, si vous souhaitez diviser la chaîne par la virgule, modifiez '[^ ] +' à '[^,]+ '. Voici un exemple de requête :

SELECT REGEXP_SUBSTR('Johnson,Blair,Black,Newman,Henderson', '[^,]+', 1, level) AS parts
FROM dual CONNECT BY REGEXP_SUBSTR('Johnson,Blair,Black,Newman,Henderson', '[^,]+', 1, level) IS NOT NULL;