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

Printemps des cartes 2024

#1 Wed 10 June 2015 09:59

white-shadow90
Participant actif
Date d'inscription: 9 Oct 2013
Messages: 91

[Postgres] - Case when // booléen

Bonjour,


J'essaie de passer un code simple pour remplacer les itérations des numéros de voies par une requête de type Case When tel que :

Code:

UPDATE  "Cadastre".parcelle_RIL
SET adresse_RIL =
CASE WHEN "Cadastre".parcelle_RIL.dindic = 'B' THEN 'BIS '
    WHEN "Cadastre".parcelle_RIL.dindic = 'T' THEN 'TER '
    WHEN "Cadastre".parcelle_RIL.dindic = 'Q' THEN 'QTER '
    ELSE "Cadastre".parcelle_RIL.dindic = ' ' end

Mais j'obtiens le message d'erreur suivant :

Code:

ERREUR:  syntaxe en entrée invalide pour le type booléen : « BIS  »
LINE 3: CASE WHEN "Cadastre".parcelle_RIL.dindic = 'B' THEN 'BIS '
                                                            ^
********** Erreur **********

ERREUR: syntaxe en entrée invalide pour le type booléen : « BIS  »
État SQL :22P02
Caractère : 103

La seule solution que j'ai trouvée est de réaliser un

Code:

UPDATE  "Cadastre".parcelle_RIL
SET dindic =
REPLACE (dindic, 'B', 'BIS ');

Auriez-vous une solution en utilisant le case when ?

Merci d'avance pour votre aide

Hors ligne

 

#2 Wed 10 June 2015 11:38

JP LLORENS
Participant assidu
Date d'inscription: 12 Nov 2008
Messages: 231

Re: [Postgres] - Case when // booléen

Bonjour
Je pense qu'il manque un select

UPDATE  "Cadastre".parcelle_RIL
SET adresse_RIL = (select  CASE WHEN "Cadastre".parcelle_RIL.dindic = 'B' THEN 'BIS '
    WHEN "Cadastre".parcelle_RIL.dindic = 'T' THEN 'TER '
    WHEN "Cadastre".parcelle_RIL.dindic = 'Q' THEN 'QTER '
    ELSE "Cadastre".parcelle_RIL.dindic = ' ' end as toto)

Cordialement
JP

Hors ligne

 

#3 Wed 10 June 2015 11:50

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1222
Site web

Re: [Postgres] - Case when // booléen

Bonjour,

la syntaxe de votre requête est bonne.

Mais vous faites deux requêtes différentes. Dans celle qui ne fonctionne pas et qui renvoie le message d'erreur, vous voulez mettre à jour la colonne "adresse_RIL" de la table "Cadastre".parcelle_RIL. Je soupçonne cette colonne d'être de type booléen et donc de refuser la valeur 'BIS'.

Dans la deuxième requête utilisée comme solution de contournement,  vous mettes à jour la colonne 'dindic'...


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#4 Wed 10 June 2015 12:16

JP LLORENS
Participant assidu
Date d'inscription: 12 Nov 2008
Messages: 231

Re: [Postgres] - Case when // booléen

En effet la syntaxe est bonne, j'ai répondu un peu rapidement !
Désolé.

Hors ligne

 

#5 Wed 10 June 2015 12:21

white-shadow90
Participant actif
Date d'inscription: 9 Oct 2013
Messages: 91

Re: [Postgres] - Case when // booléen

Bonjour,

Merci pour vos réponses.

@ JP LLORENS : Le rajout du Select ne change rien. En outre, pourquoi avoir rajouté "as toto" après le end ?

@MathieuB : La colonne adresse_RIL est un character varying (255). Effectivement, dans la requête qui fonctionne, je mets à jour la colonne dindic... puis je réutilise la valeur issue de cette colonne dans la colonne adresse_RIL, qui est une concaténation du numéro de voirie de l'indice d'itération, du type de voie et du nom de la voie.

J'ai également essayer une autre méthode en insérant un remplace() mais l'erreur persiste...

Hors ligne

 

#6 Wed 10 June 2015 13:41

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1132

Re: [Postgres] - Case when // booléen

Salut,

je pense que l'expression Case est de type booleen à cause de la branche else, qui renvoie une comparaison entre
"Cadastre".parcelle_RIL.dindic et une chaine vide et non pas juste une chaine vide.

Hors ligne

 

#7 Wed 10 June 2015 14:33

JP LLORENS
Participant assidu
Date d'inscription: 12 Nov 2008
Messages: 231

Re: [Postgres] - Case when // booléen

Après avoir testé une requête bidon, je pense en effet que c'est le ELSE qui pose problème.
Derrière le ELSE ne mets pas de de test   "Cadastre".parcelle_RIL.dindic = ' ' mais directement le résultat que tu souhaites intégrer
=> ELSE 'mavaleur'.

ex :
update infraction set isigeo_obj = 
case
when isigeo_user = 'toto' then 1
when isigeo_user = 'BIS' then 2
else  8   
end;


Ou pas de ELSE si tu ne veux rien saisir pour les valeurs autres que B,T,Q

Dernière modification par JP LLORENS (Wed 10 June 2015 14:35)

Hors ligne

 

#8 Wed 10 June 2015 14:55

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1222
Site web

Re: [Postgres] - Case when // booléen

Je confirme le problème lié à la clause ELSE !


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#9 Wed 10 June 2015 15:24

white-shadow90
Participant actif
Date d'inscription: 9 Oct 2013
Messages: 91

Re: [Postgres] - Case when // booléen

Merci à tous, il s'agissait bien de ce ElSE directement suivi par ce qu'on veut. big_smile

Hors ligne

 

Pied de page des forums

Powered by FluxBB