Kenapa x IS NOT NULL
tidak sama dengan NOT x IS NULL
?
Kode ini:
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;
memberikan hasil sebagai berikut:
(,): t
(,): f
(,): f
(1,): f
(1,): f ???
(1,): t
sementara saya berharap untuk mendapatkan output ini:
(,): t
(,): f
(,): f
(1,): f
(1,): t <<<
(1,): t
postgresql
null
Anil
sumber
sumber
id
basis kode saya yang sebenarnya, tetapi hanya setelah menghabiskan beberapa jam mencari masalah.rec_variable IS NOT NULL
memeriksa apakah semua kolom TIDAK NULL, sementararec_variable IS NULL
memeriksa apakah semua kolom NULL. Oleh karena ituNOT rec_variable IS NULL
berikan apa yang saya harapkan - jawaban untuk pertanyaan "apakah ada sesuatu di dalamnya?".Jawaban:
Anda harus membedakan dua situasi: Anda membandingkan satu KOLOM dengan NULL, atau Anda membandingkan seluruh ROW (REKAM) dengan NULL.
Pertimbangkan pertanyaan berikut:
Anda mendapatkan ini:
Ini, saya kira, apa yang Anda dan saya harapkan. Anda memeriksa satu KOLOM terhadap NULL, dan Anda mendapatkan "txt IS NOT NULL" dan "NOT txt IS NULL" adalah setara.
Namun, jika Anda melakukan pemeriksaan yang berbeda:
Lalu kamu dapatkan
Ini mungkin mengejutkan. Satu hal terlihat masuk akal (x IS NULL) dan (BUKAN x IS NULL) adalah kebalikan dari satu sama lain. Hal lain (fakta bahwa "x IS NULL" atau "x IS NOT NULL" tidak benar), terlihat aneh.
Namun, inilah yang menurut dokumentasi PostgreSQL harus terjadi:
Saya harus mengakui saya tidak berpikir saya pernah menggunakan perbandingan nilai-baris terhadap nol, tapi saya kira jika ada kemungkinan, mungkin ada beberapa use-case untuk itu. Saya pikir itu tidak umum.
sumber