banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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

scubas5 a écrit:

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

 

Pied de page des forums

Powered by FluxBB