Warum ist das x IS NOT NULL
nicht gleich NOT x IS NULL
?
Dieser 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;
gibt folgende Ausgabe aus:
(,): t
(,): f
(,): f
(1,): f
(1,): f ???
(1,): t
während ich erwarten würde, diese Ausgabe zu erhalten:
(,): t
(,): f
(,): f
(1,): f
(1,): t <<<
(1,): t
postgresql
null
Anil
quelle
quelle
id
meinem tatsächlichen Code zu suchen, aber erst, nachdem ich einige Stunden damit verbracht habe, nach einem Problem zu suchen.rec_variable IS NOT NULL
überprüft wird, ob alle Spalten NICHT NULL sind, währendrec_variable IS NULL
überprüft wird, ob alle Spalten NULL sind. DaherNOT rec_variable IS NULL
gibt es das, was ich erwartet hatte - eine Antwort auf die Frage "Ist irgendetwas drin?".Antworten:
Sie müssen zwei Situationen unterscheiden: Sie vergleichen eine SPALTE mit NULL oder Sie vergleichen die gesamte REIHE (RECORD) mit NULL.
Betrachten Sie die folgende Abfrage:
Du bekommst das:
Das ist, denke ich, was Sie und ich erwarten würden. Sie überprüfen eine Spalte gegen NULL, und Sie erhalten "txt IS NOT NULL" und "NOT txt IS NULL" sind äquivalent.
Wenn Sie jedoch eine andere Prüfung durchführen:
Dann bekommst du
Das mag überraschen. Eine Sache sieht vernünftig aus (x IST NULL) und (NICHT x IST NULL) sind das Gegenteil voneinander. Die andere Sache (die Tatsache, dass weder "x IS NULL" noch "x IS NOT NULL" wahr sind) sieht seltsam aus.
In der PostgreSQL-Dokumentation heißt es jedoch, dass Folgendes passieren sollte:
Ich muss gestehen, ich glaube nicht, dass ich jemals einen Vergleich mit Zeilenwerten gegen null durchgeführt habe, aber ich denke, wenn die Möglichkeit besteht, könnte es einen Anwendungsfall dafür geben. Ich glaube sowieso nicht, dass es üblich ist.
quelle