¿Por qué x IS NOT NULL
no es igual a NOT x IS NULL
?
Este código:
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;
da el siguiente resultado:
(,): t
(,): f
(,): f
(1,): f
(1,): f ???
(1,): t
mientras que esperaría obtener esta salida:
(,): t
(,): f
(,): f
(1,): f
(1,): t <<<
(1,): t
postgresql
null
Añil
fuente
fuente
id
en mi base de código real, pero solo después de pasar algunas horas buscando un problema.rec_variable IS NOT NULL
está comprobando si todas las columnas NO SON NULAS, mientrasrec_variable IS NULL
está comprobando si todas las columnas son NULAS. PorNOT rec_variable IS NULL
lo tanto, da lo que esperaba: una respuesta a la pregunta "¿hay algo dentro?".Respuestas:
Debe distinguir dos situaciones: compara una COLUMNA con NULL, o compara toda la FILA (REGISTRO) con NULL.
Considere la siguiente consulta:
Obtienes esto:
Esto es, supongo, lo que tú y yo esperaríamos. Está comprobando una COLUMNA contra NULL, y obtiene "txt IS NOT NULL" y "NOT txt IS NULL" son equivalentes.
Sin embargo, si realiza una comprobación diferente:
Entonces obtienes
Esto puede ser sorprendente. Una cosa parece razonable (x IS NULL) y (NOT x IS NULL) son lo opuesto el uno del otro. La otra cosa (el hecho de que ni "x IS NULL" ni "x IS NOT NULL" son verdaderos) parece extraño.
Sin embargo, esto es lo que dice la documentación de PostgreSQL que debería suceder:
Debo confesar que no creo que alguna vez haya usado una comparación de valores de fila contra nulo, pero supongo que si existe la posibilidad, podría haber algún caso de uso para ello. No creo que sea común, de todos modos.
fuente