Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre éprouvé
    Fonction qui renvoie les premières lettres d'une suite de mots
    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.

  2. #2
    Modérateur

    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

  3. #3
    Membre éprouvé
    Bonjour,

    Effectivement cela marche bien.
    Je n'aurai jamais pensé à faire cela comme ca.

    Merci

  4. #4
    Modérateur

    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.

  5. #5
    Membre éprouvé
    moi cela me convient.

    Merci à toi

  6. #6
    Expert éminent sénior
    Citation Envoyé par Waldar Voir le message
    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.
    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

  7. #7
    Expert éminent
    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
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB

  8. #8
    Expert éminent sénior
    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

  9. #9
    Membre éprouvé
    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 :


    SELECT translate(initcap(lower(nom)), 'A abcdefghijklmnopqrstuvwxyz-', 'A') into initiale FROM (SELECT chaine AS nom FROM dual);
    en ajoutant le - dans la liste
    Merci à vous

  10. #10
    Expert éminent sénior
    Non, il faut un upper
    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

    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.

  11. #11
    Expert éminent
    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
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB

  12. #12
    Modérateur

    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

  13. #13
    Expert éminent
    Bien vu !

    Erreur de débutant / fatigue de ma part (rayer la mention inutile)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB

  14. #14
    Membre éprouvé
    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.

  15. #15
    Expert éminent sénior
    Citation Envoyé par Waldar Voir le message
    Excellente idée le translate de l'initcap sur le nom !
    ...
    Tout à fait d'accord!

    Citation Envoyé par Waldar Voir le message

    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
    Mais, je pense que le Replace est lui aussi en trop.

  16. #16
    Expert éminent
    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#
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB

  17. #17
    Expert éminent
    La seule façon de virer le replace est de ne pas générer d'espace, donc cette solution fonctionne :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    TRANSLATE(INITCAP(LOWER(nom)), 'X'||LOWER(nom), 'X')


    D'ailleurs, je pense que c'est plus optimisé.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB