Pourquoi n'est x IS NOT NULL
pas égal à NOT x IS NULL
?
Ce code:
CREATE TABLE bug_test (
id int,
name text
);
INSERT INTO bug_test
VALUES (1, NULL);
DO $$
DECLARE
v_bug_test bug_test;
BEGIN
RAISE NOTICE '%: %', v_bug_test, (v_bug_test IS NULL);
RAISE NOTICE '%: %', v_bug_test, (v_bug_test IS NOT NULL);
RAISE NOTICE '%: %', v_bug_test, (NOT v_bug_test IS NULL);
SELECT *
INTO v_bug_test
FROM bug_test
WHERE id = 1;
RAISE NOTICE '%: %', v_bug_test, (v_bug_test IS NULL);
RAISE NOTICE '%: %', v_bug_test, (v_bug_test IS NOT NULL);
RAISE NOTICE '%: %', v_bug_test, (NOT v_bug_test IS NULL);
END
$$;
DROP TABLE bug_test;
donne la sortie suivante:
(,): t
(,): f
(,): f
(1,): f
(1,): f ???
(1,): t
alors que je m'attendrais à obtenir cette sortie:
(,): t
(,): f
(,): f
(1,): f
(1,): t <<<
(1,): t
postgresql
null
Anil
la source
la source
id
dans ma vraie base de code, mais seulement après avoir passé quelques heures à chercher un problème.rec_variable IS NOT NULL
vérifie si toutes les colonnes ne sont PAS NULES, tandis querec_variable IS NULL
vérifie si toutes les colonnes sont NULES. Par conséquentNOT rec_variable IS NULL
donne ce que je m'y attendais - une réponse à la question « est - il quelque chose à l' intérieur? ».Réponses:
Vous devez distinguer deux situations: vous comparez une COLONNE à NULL, ou vous comparez la RANG (ENREGISTREMENT) entière à NULL.
Considérez la requête suivante:
Vous obtenez ceci:
C'est, je suppose, ce à quoi vous et moi nous attendrions. Vous vérifiez une COLONNE par rapport à NULL et vous obtenez "txt IS NOT NULL" et "NOT txt IS NULL" sont équivalents.
Cependant, si vous effectuez une vérification différente:
Ensuite, vous obtenez
Cela peut surprendre. Une chose semble raisonnable (x EST NUL) et (PAS x EST NUL) sont l'opposé l'une de l'autre. L'autre chose (le fait que ni "x IS NULL" ni "x IS NOT NULL" ne soient vrais), semble bizarre.
Cependant, c'est ce que la documentation PostgreSQL indique qui devrait se produire:
Je dois avouer que je ne pense pas avoir jamais utilisé de comparaison de valeur par ligne contre null, mais je suppose que si la possibilité est là, il pourrait y avoir un cas d'utilisation. Je ne pense pas que ce soit courant de toute façon.
la source