#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
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: 1160
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
#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.
Hors ligne