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 22/05/2023 18:29:08

Confusion avec AND et OR

Bonjour
Je voudrais mettre en place la péremption dans une table de detail_livraison.
J'ai créé les colonnes "moisperemption" et "anneeperemption".
L'idée est de faire...
1->le mois et l'année sont tous null
2->ou, le mois est compris entre 1 et 12 et l'année est comprise entre 23 et 99.
J'ai alors créé une contrainte check de la sorte...

ADD CONSTRAINT ckperemption CHECK (
		(moisperemption IS NULL AND anneeperemption IS NULL) 
		OR (moisperemption>0 and moisperemption<13
		   and anneeperemption>22 and anneeperemption<=99)
	),

mais PostgreSQL me donne...

ADD CONSTRAINT ckperemption CHECK (moisperemption IS NULL AND anneeperemption IS NULL OR moisperemption > 0 AND moisperemption < 13 AND anneeperemption > 22 AND anneeperemption <= 99);

J'ai tester ce code...

with r as(select 0 as o, 1 as a, 23 as b
			union select 1, 0, 3
			union select 2, 2, null
		 union select 3, null, 25
		 union select 4, 0, null
		 union select 5, null, 18)
select a, b,
(
	(a IS NULL AND b IS NULL) 
		OR 
	(a>0 AND a<13 AND b>22 AND b<=99)
),
(a IS NULL AND b IS NULL OR a > 0 AND b < 13 AND a > 22 AND b <= 99)
from r order by o

voici le résultat que je ne comprend vraiment pas.

"a"     "b"        "?column?"    "?column?-2"
1      23            true                 false
0       3            false                 false
2      NULL    NULL              false
NUL     25        NULL              false
0      NULL       false                 false
NULL   18            false                 false

Seule la première ligne doit donner true (ce qui est le cas) mais tout le reste doit donner false.
Qu'est ce j'ai raté?
@+

Hors ligne

#2 22/05/2023 19:42:16

dverite
Membre

Re : Confusion avec AND et OR

Il y a une erreur d'inversion de a et b dans ce test:

(a IS NULL AND b IS NULL OR a > 0 AND b < 13 AND a > 22 AND b <= 99)

Une fois l'erreur corrigée les résultats sont comme attendus.


Le AND est prioritaire par rapport à OR donc effectivement les parenthèses autour des expressions entourant le OR sont facultatives.

Hors ligne

#3 22/05/2023 20:04:29

Re : Confusion avec AND et OR

Merci dverite
J'en ai profité en ajoutant coalesce qui evite un null comme reponse.
@+

Hors ligne

Pied de page des forums