A questão é que NULL não é considerado igual a qualquer coisa, mesmo que não seja ela mesma, mas a parte estranha é que também não é igual a ela mesma.
Considere as seguintes instruções (que são ilegais no BT-SQL Server T-SQL, mas são válidas no My-SQL, no entanto, é isso que o ANSI define como nulo e pode ser verificado mesmo no SQL Server usando instruções de caso etc.)
SELECT NULL = NULL -- Results in NULL
SELECT NULL <> NULL -- Results in NULL
Portanto, não há resposta verdadeira / falsa para a pergunta, mas a resposta também é nula.
Isso tem muitas implicações, por exemplo, em
- Instruções CASE, nas quais qualquer valor nulo sempre usará a cláusula ELSE, a menos que você use explicitamente a condição WHEN IS NULL ( NÃO a
WHEN NULL
condição )
- Concatenação de string, como
SELECT a + NULL -- Results in NULL
- Em uma cláusula WHERE IN ou WHERE NOT IN, como se você deseja resultados corretos, certifique-se de que na subconsulta correlacionada filtre quaisquer valores nulos.
Pode-se substituir esse comportamento no SQL Server, especificando SET ANSI_NULLS OFF
, no entanto, isso NÃO é recomendado e não deve ser feito, pois pode causar muitos problemas, simplesmente devido ao desvio do padrão.
(Como uma observação lateral, no My-SQL há uma opção para usar um operador especial <=>
para comparação nula.)
Em comparação, nas linguagens de programação gerais, nulo é tratado é um valor regular e é igual a si mesmo; no entanto, é o valor NAN que também não é igual a si mesmo, mas pelo menos retorna 'false' ao compará-lo a si mesmo (e ao verificar se não é igual a diferentes linguagens de programação, tem implementações diferentes).
Observe, no entanto, que nas linguagens Básicas (por exemplo, VB etc.) não existe uma palavra-chave 'nula' e, em vez disso, é usada a palavra-chave 'Nada', que não pode ser usada em comparação direta e, em vez disso, é necessário usar 'IS' como no SQL, no entanto, é de fato igual a si mesmo (ao usar comparações indiretas).