PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 08/09/2010 16:54:45

Finality
Membre

Not In Avec Valeur Null

Bonjour tout le monde,

je viens vous voir car je viens de rencontrer un problème dont je n'arrive pas à expliquer le pourquoi du comment.

Je vais vous faire un descriptif de l'état initial :

je possède deux tables, t1 et t2, comprenant chacune 2 champs de type varchar, ce qui donne :

t1 : champ1, champ2
t2 : champ1, champ2

t2.champ2 peux être NULL

Lorsque je tente cette requête

SELECT * FROM t1 WHERE t1.champ1 NOT IN (SELECT t2.champ2 FROM t2);

Or, si ma sous requête me retourne des résultats NULL, le NOT IN ne fonctionne plus : t1.champ1 n'est pas dans la liste retournée par ma sous requête, mais il n'est pas retournée par la requête globale....

Je vous donne quelques requêtes pour pouvoir essayer :

CREATE TABLE t1(
  champ1 character varying(50),
  champ2 character varying(50)
)

CREATE TABLE t2(
  champ1 character varying(50),
  champ2 character varying(50)
)

INSERT INTO t1(champ1, champ2) VALUES('Non', 'Test');
INSERT INTO t2(champ1, champ2) VALUES('Test', 'Test');
INSERT INTO t2(champ1) VALUES('Test');

Je vous remercie d'avance pour votre éclaircicement
Cordialement

Finality

Hors ligne

#2 08/09/2010 17:08:34

gleu
Administrateur

Re : Not In Avec Valeur Null

Si la sous-requête (SELECT t2.champ2 FROM t2) renvoit une valeur NULL, comment peut-on savoir si t1.champ1 se trouve ou pas dans le résultat de la sous-requête ? on ne peut pas car une valeur NULL, c'est pas une absence de valeur mais une valeur inconnue. On ne sait pas. Et quand on ne sait pas, on renvoit la valeur NULL. D'où le manque de résultat.

Ça suit à la lettre le standard SQL.


Guillaume.

Hors ligne

#3 09/09/2010 09:51:56

Finality
Membre

Re : Not In Avec Valeur Null

Bonjour,

tout d'abord merci pour ta réponse.

donc si j'ai bien compris NULL n'est pas rien ,mais une valeur inconnu.... or d'après certains sites NULL est bien l'abscence de valeur (http://www.linuxtopia.org/online_books/ … 32_001.htm)

De plus, si un fait une reqete SELECT * FROM t2 WHERE champ2 <> NULL cette requête marche bien.... DONC si ma sous requête me retourne 2 valeurs, NULL et Test, en quoi le NOT IN ne fonctionne pas .... Ne possède-t-il pas un comportement tel que le where ?

Je te remercie pour ton aide, car je tiens vraiment à comprendre ce problème

Finality

Hors ligne

#4 09/09/2010 10:10:19

Marc Cousin
Membre

Re : Not In Avec Valeur Null

NULL can be thought of as a meta-value: a value that represents a  lack of a value , which will  never  be equivalent to a non-NULL value.

Ça me semble très clair. NULL n'est pas une valeur comme les autres.

D'ailleurs on le voit très bien dans la syntaxe IS NULL, on ne peut pas écrire = NULL

La logique ternaire est très bien expliquée ici :
http://fr.wikipedia.org/wiki/Logique_ternaire


Marc.

Hors ligne

#5 09/09/2010 10:47:20

gleu
Administrateur

Re : Not In Avec Valeur Null

Tout dépend de ce que tu entends par "marche très bien". Selon ma définition, oui, le résultat est bon. Voici ton test :

finality=# select *, champ2 <> NULL AS "DIFF", champ2 IS NOT NULL AS "IS NOT" from t2;
 champ1 | champ2 | DIFF | IS NOT 
--------+--------+------+--------
 Test   | Test   |      | t
 Test   |        |      | f
(2 lignes)

Ce qu'on voit, c'est que le résultat de "champ2 <> NULL" renvoie toujours NULL, quelque soit la valeur de champ2. C'est normal car on essaie de tester champ2 avec une valeur inconnue, ce qui peut n'avoir qu'un seul résultat, ou plutôt une absence de résultat : NULL. Le résultat de "IS NOT" est beaucoup plus intéressant car il nous indique si le champ champ2 est NULL ou pas.


Guillaume.

Hors ligne

Pied de page des forums