2017-10-20 14 views
0

Quelle est la syntaxe REGEXP correcte pour générer le résultat souhaité? Merci!Utilisez les fonctions REGEXP dans SQL pour insérer des caractères de soulignement entre les lettres majuscules et une lettre minuscule qui les précède

Tableau 1 ressemble à ceci:

user_id  city_state 
123   MiamiFlorida 
234   PhiladelphiaPennsylvania 
345   ClevelandOhio 

Je voudrais à ressembler à ceci:


user_id  city_state 
123   Miami_Florida 
234   Philadelphia_Pennsylvania 
345   Cleveland_Ohio 

====== ====== EDITED

Après avoir appliqué la logique de @ Gary_W via Presto, retourné le résultat suivant:

USER_ID FIXED 
---------- ------------------------------ 
     123 Miam1_2lorida 
     234 Philadelphi1_2ennsylvania 
     345 Clevelan1_2hio 

Comment conservons-nous la lettre finale?

+0

Comment regex va-t-il analyser un nom de ville aléatoire à partir d'une chaîne? –

+0

Bon point. Laissez-moi reformuler. Utilisez regexp pour: 1. Trouver une lettre majuscule 2. Déterminez s'il y a une lettre qui précède la lettre majuscule 3. S'il y a une lettre qui précède la lettre majuscule, insérez un trait de soulignement entre la lettre majuscule et celle qui le précède 4. S'il n'y a pas de lettre qui précède la lettre majuscule, ne faites rien – Levine

+0

@JacobH, je viens de clarifier la question. Merci! – Levine

Répondre

2

Vous n'avez pas spécifié de SGBDR, mais dans Oracle, je ferais quelque chose comme ça. Cherchez une lettre de n'importe quel cas suivi d'une lettre majuscule et mettez chacun dans leur propre groupe afin qu'ils se "souviennent". Puis remplacez-les par un trait de soulignement entre les deux. Chaque groupe mémorisé est référencé dans l'ordre par \ 1, \ 2 etc.

Vous devriez être capable d'adapter l'expression rationnelle à votre goût.

EDIT - L'affiche utilise Presto, et cet outil utilise un signe dollar au lieu d'un antislash devant le numéro de groupe mémorisé.

SQL> with tbl(user_id,city_state) as (
     select 123, 'MiamiFlorida' from dual union all 
     select 234, 'PhiladelphiaPennsylvania' from dual union all 
     select 345, 'ClevelandOhio' from dual 
    ) 
    select user_id, 
      regexp_replace(city_state, '([a-zA-Z])([A-Z])', '\1_\2') fixed 
    from tbl; 

    USER_ID FIXED 
---------- ------------------------------ 
     123 Miami_Florida 
     234 Philadelphia_Pennsylvania 
     345 Cleveland_Ohio 
+0

Merci, @Gary_W. Mes résultats ressemblaient à ceci: 'USER_ID FIXE ---------- -------------------------- ---- 123 Miam1_2lorida 234 Philadelphi1_2ennsylvania 345 Clevelan1_2hio' Comment pouvons-nous conserver la dernière lettre? – Levine

+0

Votre personnage pour identifier le groupe mémorisé doit être différent. Veuillez mettre à jour votre publication originale avec le bouton d'édition et afficher votre code car les commentaires ne permettent pas le formatage. Indiquez quel outil ou base de données vous utilisez aussi. –