Problème de IF avec AND ou OR
Bonjour,
Je crée la procédure suivante:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| CREATE OR REPLACE FUNCTION tototest( _clef bigint )
RETURNS void
LANGUAGE plpgsql
AS
$$
DECLARE
BEGIN
IF _clef <> NULL AND _clef > 0 THEN
RAISE NOTICE 'UPDATE _clef: %', _clef;
ELSE
RAISE NOTICE 'AJOUT _clef: %', _clef;
END IF;
END;
$$;
ALTER FUNCTION tototest( bigint ) OWNER TO postgres; |
Quand je la teste avec les requêtes suivantes:
Code:
1 2 3
| select donnees.tototest(NULL);
select donnees.tototest(0::bigint);
select donnees.tototest(1::bigint); |
J'obtiens:
Code:
1 2 3 4 5 6 7
| NOTICE: AJOUT _clef: <NULL>
CONTEXT: PL/pgSQL function donnees.tototest(bigint) line 8 at RAISE
NOTICE: AJOUT _clef: 0
CONTEXT: PL/pgSQL function donnees.tototest(bigint) line 8 at RAISE
NOTICE: AJOUT _clef: 1
CONTEXT: PL/pgSQL function donnees.tototest(bigint) line 8 at RAISE
résultat de la requête de 1 ligne annulé. |
Or comme c'est un ET dans le IF, quand clef = 1 je devrais avoir un UPDATE ?
Si je change
Code:
IF _clef <> NULL AND _clef > 0 THEN
en
Code:
IF _clef <> NULL OR _clef > 0 THEN
j'obtiens le bon fonctionnement, à savoir:
Code:
1 2 3 4 5 6
| NOTICE: AJOUT _clef: <NULL>
CONTEXT: PL/pgSQL function donnees.tototest(bigint) line 8 at RAISE
NOTICE: AJOUT _clef: 0
CONTEXT: PL/pgSQL function donnees.tototest(bigint) line 8 at RAISE
NOTICE: UPDATE _clef: 1
CONTEXT: PL/pgSQL function donnees.tototest(bigint) line 6 at RAISE |
Ma version de PostgreSQL est: "PostgreSQL 9.6.15 on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, 64-bit"
C'est moi ou je ne sais plus coder de IF ???