Bonjour,
je cherche une fonction qui permet de renvoyer les premières lettres d'une suite de mots.
Exemple : Jean Pierre -> jp
Est-ce que cela existe ?
Merci.
Bonjour,
je cherche une fonction qui permet de renvoyer les premières lettres d'une suite de mots.
Exemple : Jean Pierre -> jp
Est-ce que cela existe ?
Merci.
En jouant avec lower, initcap et translate, ça doit fonctionner :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 select translate(initcap(lower(nom)), 'A abcdefghijklmnopqrstuvwxyz', 'A') as res from (select 'Jean pierre' as nom from dual); RES --- JP
Bonjour,
Effectivement cela marche bien.
Je n'aurai jamais pensé à faire cela comme ca.
Merci
J'avais commencé à regarder des expressions régulières, mais ce n'est pas mon point fort alors j'ai détourné ainsi.
Il y a peut-être plus simple avec les REGEXP.
moi cela me convient.
Merci à toi
Peut être quelque chose comme ça.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SQL> SELECT regexp_replace('Jean Pierre','(^|\s)(\w)(\w)+','\2') AS nom FROM dual; NOM --- JP
Attention, initcap considère qu'un trait d'union sépare 2 mots.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT INITCAP(LOWER('jean-pierre pernot')) FROM dual Jean-Pierre Pernot
Mais on peut jouer avec les expressions régulières
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SQL> SELECT regexp_replace('Jean-Pierre Pernot','(^|\s)(\S)(\S)+','\2') AS nom FROM dual; NOM --- JP
bonjour,
j'ai essayé toutes vos solutions avec les expressions régulières.
J'avoue ne pas tout comprendre.
Mais est il possible de faire en sorte avec une expression régulière que :
jean-Pierre ou Jean Pierre ou Jean Pierre renvoient JP ?
J'avais contourné le soucis comme cela :
en ajoutant le - dans la listeSELECT translate(initcap(lower(nom)), 'A abcdefghijklmnopqrstuvwxyz-', 'A') into initiale FROM (SELECT chaine AS nom FROM dual);
Merci à vous
Non, il faut un upper
Ca commence soit au début de la chaine soit avec un blanc soit avec un – constitué dans un group, suivi d'un caractère alphanumérique dans un group, suivi de zéro ou plusieurs caractères alphanumériques dans un troisième group. Le deuxième group c’est-à-dire le caractère qui suit le début du mot est utilisé à la place du mot.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 SQL> With data As ( 2 Select 'jean-Pierre' as nom from dual union all 3 Select 'Jean Pierre' from dual union all 4 Select 'Jean Pierr' from dual 5 ) 6 Select Upper(regexp_replace(nom,'(^|\s|-)(\w)(\w)*','\2')) FROM data 7 / UPPER(REGEXP_REPLACE(NOM,'(^|\ -------------------------------------------------------------------------------- JP JP JP
Avec initcap (méthode de Waldar simplifiée)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 WITH DATA AS ( SELECT 'jean-Pierre' AS nom FROM dual UNION ALL SELECT 'Jean Pierre' FROM dual UNION ALL SELECT 'Jean Pierr' FROM dual ) SELECT nom, REPLACE(TRANSLATE(INITCAP(LOWER(nom)), LOWER(nom), LPAD(' ', LENGTH(nom))), ' ') cpde FROM DATA NOM CPDE jean-Pierre JP Jean Pierre JP Jean Pierr JP
Excellente idée le translate de l'initcap sur le nom !
Par contre je ne vois pas l'intérêt du lpad avec la longueur puisqu'au final ces espaces on va les sucrer :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 WITH DATA AS ( SELECT 'jean-Pierre' AS nom FROM dual UNION ALL SELECT 'Jean Pierre' FROM dual UNION ALL SELECT 'Jean Pierr' FROM dual ) SELECT nom, REPLACE(TRANSLATE(INITCAP(LOWER(nom)), LOWER(nom), ' '), ' ') cpde FROM DATA; NOM CPDE jean-Pierre JP Jean Pierre JP Jean Pierr JP
Bien vu !
Erreur de débutant / fatigue de ma part (rayer la mention inutile)
et bien merci à vous.
Très intéressant.
Même si je pense ne retenir que la dernière solution , les autres m'auront au moins permis d'enrichir mes connaissances en matière de sql.
Non, il faut le replace
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 WITH DATA AS ( SELECT 'jjean-Pierre' AS nom FROM dual UNION ALL SELECT 'Jean PierreJ' FROM dual UNION ALL SELECT 'Jean Pierr' FROM dual ) SELECT nom, '#'|| TRANSLATE(INITCAP(LOWER(nom)), LOWER(nom), ' ') || '#' cpde FROM DATA; NOM CPDE jjean-Pierre #J P# Jean PierreJ #JP # Jean Pierr #JP#
La seule façon de virer le replace est de ne pas générer d'espace, donc cette solution fonctionne :
D'ailleurs, je pense que c'est plus optimisé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part TRANSLATE(INITCAP(LOWER(nom)), 'X'||LOWER(nom), 'X')
Partager