PostgreSQL - Comparação com valor nulo

Muitas vezes necessitamos montar uma expressão para verificar se um determinado valor é igual ou diferente a um outro valor, até mesmo comparar dois campos como o exemplo abaixo:

(campo_a = campo_b)

Quando ambas entradas possuem valores ('texto' = 'texto'), os Operadores de Comparação poderão retornar true caso a condição seja verdadeira ou false quando não verdadeira. Porém não existe um valor de retorno (desconhecido) quando estiver comparando com um valor nulo.

Se você necessita fazer uma comparação mesmo quando um valor for nulo, então deve utilizar os Predicados de Comparação, os quais são:

PREDICADO DESCRIÇÃO
a BETWEEN x AND y entre
a NOT BETWEEN x AND y não entre
a BETWEEN SYMMETRIC x AND y entre, depois de classificar os valores de comparação
a NOT BETWEEN SYMMETRIC x AND y não entre, depois de classificar os valores de comparação
a IS DISTINCT FROM b não igual (ou diferente), tratando nulo como um valor comum
a IS NOT DISTINCT FROM b igual, tratando nulo como um valor comum
expression IS NULL é nulo
expression IS NOT NULL não é nulo
expression ISNULL é nulo (sintaxe não padrão)
expression NOTNULL não é nulo (sintaxe não padrão)
boolean_expression IS TRUE é verdadeiro
boolean_expression IS NOT TRUE é falso ou desconhecido
boolean_expression IS FALSE é falso
boolean_expression IS NOT FALSE é verdadeiro ou desconhecido
boolean_expression IS UNKNOWN é desconhecido
boolean_expression IS NOT UNKNOWN é verdadeiro ou falso


Para os valores não-nulos, IS DISTINCT FROM é o mesmo que o operador != (diferente). No entanto, se ambos os valores forem nulos, o retorno será false e, se apenas um valor for nulo, o retorno será true. Da mesma forma, IS NOT DISTINCT FROM é idêntico ao operador = (igual) para os valores não-nulos, mas retorna true quando ambos valores são nulos e false quando apenas um valor é nulo. Assim, esses predicados efetivamente atuam como se nulo fosse um valor de dados normal, em vez de desconhecido.

Exemplos:

SELECT ('texto') = (NULL) --Retorno: desconhecido

SELECT ('texto') IS NOT DISTINCT FROM (NULL) --Retorno: false

SELECT ('texto') != (NULL) --Retorno: desconhecido

SELECT ('texto') IS DISTINCT FROM (NULL) --Retorno: true

Comentários