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:
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:
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:
(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
Postar um comentário