Por que x IS NOT NULL
não é 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;
dá a seguinte saída:
(,): t
(,): f
(,): f
(1,): f
(1,): f ???
(1,): t
enquanto eu esperaria obter esta saída:
(,): t
(,): f
(,): f
(1,): f
(1,): t <<<
(1,): t
postgresql
null
Anil
fonte
fonte
id
na minha base de código real, mas somente depois de passar algumas horas procurando por um problema.rec_variable IS NOT NULL
está verificando se todas as colunas NÃO são NULL, enquantorec_variable IS NULL
está verificando se todas as colunas são NULL. Daí,NOT rec_variable IS NULL
dá o que eu esperava - uma resposta para a pergunta "existe algo dentro?".Respostas:
Você precisa distinguir duas situações: você pode comparar uma COLUNA contra NULL ou comparar toda a ROW (RECORD) com NULL.
Considere a seguinte consulta:
Você obtém isto:
Acho que é isso que você e eu esperávamos. Você está verificando uma COLUNA em relação a NULL e obtém "txt NÃO É NULL" e "NÃO txt É NULL" são equivalentes.
No entanto, se você fizer uma verificação diferente:
Então você recebe
Isso pode ser surpreendente. Uma coisa parece razoável (x IS NULL) e (NOT x IS NULL) são o oposto uma da outra. A outra coisa (o fato de que nem "x É NULL" nem "x NÃO É NULL" é verdadeiro) parece estranho.
No entanto, é isso que a documentação do PostgreSQL diz que deve acontecer:
Devo confessar que acho que nunca usei uma comparação com valor de linha contra nulo, mas acho que, se a possibilidade existe, pode haver algum caso de uso para ela. Eu não acho que seja comum, de qualquer maneira.
fonte