Vous n'êtes pas identifié(e).
Pages : 1
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
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.
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Merci dverite
J'en ai profité en ajoutant coalesce qui evite un null comme reponse.
@+
Hors ligne
Pages : 1