Eu tenho a tabela Party com as colunas party_Id, party_type
Quando uso as consultas abaixo, recebo dois tipos diferentes de resultado.
SELECT * FROM party WHERE party_type = null
Não retorna nada
SELECT * FROM party WHERE party_type IS NULL
Retorna todas as linhas possíveis
Precisa de uma consulta que deve aceitar null e valores.
De acordo com o padrão SQL, as comparações (e operações booleanas) usam lógica de 3 valores
(true, false, unknown)
, com desconhecido sendo representado porNULL
. A seguinte expressão retorna desconhecido (representado porNULL
):Enquanto
retornará um booleano puro
(true, false)
.Você provavelmente quer um "predicado de comparação NULL-safe":
Ver Predicados de Comparação
A pergunta:
retorna todas as linhas em que [predicate] é avaliado como TRUE.
A tabela verdade para iguais com domínio FALSE, TRUE , NULL
NULL neste contexto pode ser pensado como UNKNOWN, ou seja, se compararmos algo com UNKNOWN o resultado é UNKNOWN (inclusive se compararmos UNKNOWN com UNKNOWN).
Seu primeiro predicado:
portanto, sempre avalie como NULL e, como resultado, nenhuma linha será retornada da consulta.
IS NULL
é um predicado especial que pode ser usado para testar se algo é nulo. Avalia de acordo com:Seu segundo predicado, portanto, é avaliado como TRUE quando party_type IS NULL e essas linhas são retornadas da consulta.
NULL significa SEM VALOR
Se você estiver procurando por campos NULL, você deve usar:
Caso você precise de campos vazios (strings) ou nulos, verifique ambas as condições:
Ou você pode forçar o resultado quando o campo for nulo: