Dlaczego x IS NOT NULL
nie jest równy NOT x IS NULL
?
Ten kod:
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;
daje następujący wynik:
(,): t
(,): f
(,): f
(1,): f
(1,): f ???
(1,): t
podczas gdy spodziewałbym się uzyskać ten wynik:
(,): t
(,): f
(,): f
(1,): f
(1,): t <<<
(1,): t
postgresql
null
Indygowiec
źródło
źródło
id
w mojej prawdziwej bazie kodu, ale dopiero po kilku godzinach szukania problemu.rec_variable IS NOT NULL
sprawdza, czy wszystkie kolumny NIE są NULL, podczas gdyrec_variable IS NULL
sprawdza, czy wszystkie kolumny są NULL. StądNOT rec_variable IS NULL
daje to, czego się spodziewałem - odpowiedź na pytanie „czy coś jest w środku?”.Odpowiedzi:
Musisz rozróżnić dwie sytuacje: porównujesz jedną KOLUMNĘ z NULL lub porównujesz cały WIERSZ (NAGRYWANIE) z NULL.
Rozważ następujące zapytanie:
Dostajesz to:
Myślę, że tego właśnie spodziewalibyśmy się. Sprawdzasz jedną KOLUMNĘ pod kątem NULL i otrzymujesz „txt IS NOT NULL” i „NOT txt IS NULL” są równoważne.
Jeśli jednak wykonasz inną kontrolę:
To dostajesz
To może być zaskakujące. Jedna rzecz wygląda rozsądnie (x IS NULL), a (NOT x IS NULL) jest przeciwna do siebie. Inna sprawa (fakt, że ani „x IS NULL”, ani „x IS NOT NULL” nie są prawdziwe), wygląda dziwnie.
Jednak tak mówi dokumentacja PostgreSQL , która powinna się zdarzyć:
Muszę wyznać, że nie sądzę, żebym kiedykolwiek używał porównania wartości równej zeru z wartością zerową, ale sądzę, że jeśli istnieje taka możliwość, może istnieć jakiś przypadek użycia. W każdym razie nie sądzę, żeby to było wspólne.
źródło