J'essaie de convertir la valeur de la colonne de CamelCase en underscore_case, voici ce que j'ai essayé:

SELECT regexp_replace(ColumnName, '([A-Z])', '_\1', 2) FROM Table;

Mais cela renverra d_a_r_k_C_y_a_n pour la valeur darkCyan.

Comment puis-je résoudre ça ?

0
Renaud is Not Bill Gates 24 nov. 2017 à 17:10

3 réponses

Meilleure réponse

Cette question peut être délicate, peut-être même une boîte de vers, car le cas de chameau peut avoir des cas extrêmes qui sont difficiles à gérer. Considérez la chaîne de casse camel suivante, qui se trouve avoir un acronyme entièrement en majuscules au milieu:

myIBMComputerIsSlow

Si nous voulons traiter chaque lettre de l'acronyme IBM comme un mot séparé, alors la réponse donnée par @wiktor couvre bien ce problème. On aboutirait alors à ce qui suit:

my_I_B_M_Computer_Is_Slow

Si, par contre, nous voulons conserver l'acronyme, nous devons faire plus de travail:

SELECT
    REGEXP_REPLACE(REGEXP_REPLACE ('myIBMComputerIsSlow', '([A-Z])([A-Z][a-z])',
                                   '\1_\2', 1, 0, 'c'),
                  '([a-z])([A-Z])', '\1_\2', 1, 0, 'c') AS output
FROM dual

Cela produirait les éléments suivants:

my_IBM_Computer_Is_Slow

Dans ce cas, nous pouvons insérer un trait de soulignement dans la chaîne sous l'une des deux conditions suivantes:

  • une lettre minuscule est immédiatement suivie d'une lettre majuscule
  • une lettre majuscule est suivie de majuscule, suivie de minuscule

Notez que le deuxième cas est la façon dont nous détectons qu'un acronyme se termine et qu'un nouveau mot casse chameau commence.

Si vous voulez que la sortie entière soit en minuscules, ce que semble impliquer votre question, vous pouvez alors ajouter une autre étape et utiliser la fonction LOWER.

Démo

5
Tim Biegeleisen 25 nov. 2017 à 07:52

Le sql de l'affiche originale:

SELECT regexp_replace(ColumnName, '([A-Z])', '_\1', 2) FROM Table;

Fonctionne bien dans Oracle 12c sql, c'est-à-dire que «darkCyan» devient «dark_cyan».

0
Emma 11 mai 2019 à 00:35

Vous pouvez utiliser

SELECT regexp_replace('AbcDef', '([A-Z])', '_\1', 2, 0, 'c') from dual

2 indique que le deuxième caractère est le point de départ pour rechercher une correspondance, 0 signifie que toutes les correspondances doivent être trouvées et c spécifie une recherche et un remplacement sensibles à la casse.

Consultez le test en ligne, résultat:

enter image description here

2
Wiktor Stribiżew 24 nov. 2017 à 14:18
47475014