#1 Wed 31 October 2018 11:18
- scubas5
- Participant occasionnel
- Date d'inscription: 23 Mar 2007
- Messages: 39
Chaine de caractère postgresql
Bonjour à tous,
je cherche à récupérer le dernier mot d'une chaine de caractères:
j'ai une table (postgres 9.3) qui contient les noms des rues.
exemple: "av jean charles rivet" et je souhaite récupérer le dernier mot du nom de la rue soit "rivet"
dans ma table, le nom de la rue peut se situer en 2ème, 3ème, etc.. position.
J'ai cherche depuis un bon moment et j'ai pas trouvé de solution.
Pouvez vous m'aider.
Merci
Hors ligne
#2 Wed 31 October 2018 11:45
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Chaine de caractère postgresql
Bonjour,
Vous pouvez découper la chaine de texte par des espaces et autres caractères de séparation et prendre le dernier element du tableau généré:
Code:
with tmp as ( select (regexp_split_to_array('av jean charles rivet', '\s')) as arr ) select arr, arr[cardinality(arr)] as last; from tmp; arr last {av,jean,charles,rivet} rivet
Nicolas
Hors ligne
#3 Wed 31 October 2018 14:35
- scubas5
- Participant occasionnel
- Date d'inscription: 23 Mar 2007
- Messages: 39
Re: Chaine de caractère postgresql
Merci pour cette requête, je vais tester ça dans mon contexte.
Je reviendrai vers vous pour la suite (bonne ou mauvaise).
Cordialement.
Hors ligne
#4 Wed 31 October 2018 16:21
- scubas5
- Participant occasionnel
- Date d'inscription: 23 Mar 2007
- Messages: 39
Re: Chaine de caractère postgresql
Après quelques essai,
j'ai le message d'erreur:
la fonction cardinality(text[]) n'existe pas
Une idée?
Cordialement.
Hors ligne
#5 Wed 31 October 2018 16:28
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: Chaine de caractère postgresql
Salut,
un one-liner, qui je pense devrait fonctionner,
pour obtenir le dernier mot d'une chaine:
>=PG10:
SELECT (regexp_match('av jean dominique River-ma''am', '[\w\-'']+$', 'i'))[1];
<PG10
SELECT (SELECT regexp_matches('av jean dominique River-ma''am', '[\w\-'']+$', 'i') LIMIT 1) nom;
Dernière modification par tumasgiu (Wed 31 October 2018 20:16)
Hors ligne
#6 Thu 01 November 2018 10:13
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Chaine de caractère postgresql
Après quelques essai,
j'ai le message d'erreur:
la fonction cardinality(text[]) n'existe pas
Une idée?
Cordialement.
Surement, du a la version de PG: essayez array_length(arr, 1)
Nicolas
Hors ligne
#7 Mon 05 November 2018 09:21
- scubas5
- Participant occasionnel
- Date d'inscription: 23 Mar 2007
- Messages: 39
Re: Chaine de caractère postgresql
Bonjour,
J'ai utiliser la réponse de tumasgiu.
Voici ma requête qui me retourne la dernière chaine de caractère:
select (SELECT regexp_matches(mon_champ, '[\w\-'']+$', 'i') LIMIT 1) nom
from ma_table
ça fonctionne nickel.
PS
Est-il possible de supprimer les { } dans le résultat de la requête
Un grand merci à vous pour votre aide.
Hors ligne
#8 Mon 05 November 2018 09:33
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: Chaine de caractère postgresql
Bonjour,
Deux solutions soit unnest(mon_tableau), soit array_to_string().
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#9 Mon 05 November 2018 09:58
- scubas5
- Participant occasionnel
- Date d'inscription: 23 Mar 2007
- Messages: 39
Re: Chaine de caractère postgresql
Merci ChristopheV
Requête terminée:
select (SELECT unnest(regexp_matches(mon_champ, '[\w\-'']+$', 'i'))LIMIT 1) nom
from ma_table
Encore une fois merci à tous.
Cordialement
Hors ligne
#10 Mon 05 November 2018 11:14
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: Chaine de caractère postgresql
Comme l'a indiquer Christophe,
le fait que la donnée soit encadrée par des accolades indique
que la colonne est de type tableau.
Pour accéder à un élément d'un tableau, sans passer par une sous requête
comme vous l'avez fait, ou utiliser une fonction d’agrégat comme array_to_string,
il faut lui suffixer l'index de l'élément que l'on veut accéder, encadré par des crochets,
(index base 1)
Exemple <PG10 de mon message précédent corrigé (désolé):
SELECT (SELECT regexp_matches(mon_champ, '[\w\-'']+$', 'i') LIMIT 1)[1] nom
Dernière modification par tumasgiu (Mon 05 November 2018 11:18)
Hors ligne
#11 Mon 05 November 2018 16:40
- scubas5
- Participant occasionnel
- Date d'inscription: 23 Mar 2007
- Messages: 39
Re: Chaine de caractère postgresql
Merci de ton complément d'information, tumasgiu
Cordialement
Hors ligne
#12 Wed 07 November 2018 07:51
- sam92
- Juste Inscrit !
- Date d'inscription: 6 Nov 2018
- Messages: 7
Re: Chaine de caractère postgresql
Bonjour,
Code:
SELECT regexp_replace(rtrim(mon_champ),'.* +','') from ma_table;
Je pense que ceci devrait faire l'affaire.
La fonction regexp_replace retire de la chaîne les espaces et tout ce qui est situé avant ces espaces.
La fonction rtrim à été ajouté au cas où on aurait des espaces situés à la fin de la chaîne, pour éviter que la fonction précédente ne retourne rien.
Hors ligne