Skip site navigation (1) Skip section navigation (2)

Re: Truc bizarre dans where in

From: Guillaume Lelarge <guillaume(at)lelarge(dot)info>
To: c(dot)maumont(at)univitis(dot)fr
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Truc bizarre dans where in
Date: 2009-03-12 10:03:44
Message-ID: 49B8DE00.4060400@lelarge.info (view raw or flat)
Thread:
Lists: pgsql-fr-generale
Bonjour,

c(dot)maumont(at)univitis(dot)fr a écrit :
> [...]
> Je viens de tomber sur un truc qui m'interpelle :
> 
> J'ai lancé une requête contenant une erreur :
> 
> UPDATE formu SET soc = '2' WHERE n_formu in (SELECT n_formu FROM cp WHERE n_tcp = 11 OR n_tcp = 12);
> 
> L'erreur c'est qu'il n'y a pas de colonne n_formu dans la table cp. 
> J'aurais du AMHA avoir une sortie en erreur alors que l'update a été effectué sur toutes les lignes de la table (sur une base de test OUF !).
> 

Non, la colonne existe bien, mais dans la table formu. En gros, le
SELECT renvoie la valeur de n_formu à condition qu'il existe une ligne
dans cp avec n_tcp à 11 ou à 12.

Il doit y avoir une ligne comme ça dans la table cp, du coup vous vous
retrouvez avec une requête équivalente à :

UPDATE formu SET soc = '2' WHERE n_formu = n_formu;

D'où la mise à jour intégrale de la table.

> C'est d'autant plus drôle que si je lance :
> 
> UPDATE formu SET soc = '2' WHERE n_formu in (SELECT toto FROM cp WHERE n_tcp = 11 OR n_tcp = 12);
> 
> J'ai bien une erreur : ERREUR:  la colonne « toto » n'existe pas
> 

Parce que toto n'est pas une colonne de cp et de formu. Par contre, si
vous faites :

UPDATE formu SET soc = '2' WHERE n_formu in (SELECT soc FROM cp WHERE
n_tcp = 11 OR n_tcp = 12);

vous obtiendrez l'erreur (en 8.3) :

ERROR:  operator does not exist: integer = text
ASTUCE : No operator matches the given name and argument type(s). You
might need to add explicit type casts.

(j'ai déclaré dans mon test que soc est de type text et n_formu de type
integer... et mon test se fait sur une 8.3.6, avec ce qu'on sait des
convertions implicites :) )

> Y-a-il une subtilité SQL qui m'échappe ? 
> 
> DEBIAN/ETCH
> psql -V
> psql (PostgreSQL) 8.1.11
> 
> Cordialement.
> 
> Christophe Maumont
> 
> 


-- 
Guillaume.
 http://www.postgresqlfr.org
 http://dalibo.com

In response to

pgsql-fr-generale by date

Next:From: c.maumontDate: 2009-03-12 10:14:09
Subject: Re: Truc bizarre dans where in
Previous:From: Marc CousinDate: 2009-03-12 10:01:53
Subject: Re: Truc bizarre dans where in

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group