Inspirado por uma pergunta StackOverflow ( Por que o SQL não suporta "= null" em vez de "is null"? ).
Existe um DBMS que realmente suporte a = NULL
sintaxe?
Inspirado por uma pergunta StackOverflow ( Por que o SQL não suporta "= null" em vez de "is null"? ).
Existe um DBMS que realmente suporte a = NULL
sintaxe?
Algumas implementações de SQL reconhecem x = NULL como igualdade, o padrão ISO/ANSI, por outro lado, não. No SQL Server, por exemplo, SET ANSI_NULLS OFF resulta em (NULL = NULL) = true.
Você pode configurar o Postgres para ver
NULL=NULL
como verdadeiro. Consulte a documentação em transform_null_equals para obter mais detalhes. Fim da parte específica do Postgres da resposta.Não recomendo usar essa configuração para
NULL
igualar outroNULL
poisNULL
tem o significado de ser desconhecido. Como você não sabe se duas coisas desconhecidas se referem ao mesmo objeto (valor), compararNULL
com algo deve sempre resultar emNULL
(o resultado da comparação é desconhecido). Teria sido melhor chamar deNULL
forma diferente – por exemploUNKNOWN
– mas o SQL optou por não fazer isso.Se você quiser ver se algo é desconhecido, use
thing is NULL
.Se você quiser ver se duas coisas são iguais ou ambas,
NULL
usething1 is not distinct from thing2
. Consulte o final da página das funções de comparação do Postgre para obter mais informações sobre esta sintaxe. A documentação do Firebird sobre o assunto também inclui uma tabela que mostra exemplos de comparações e seus resultados. A Wikipédia também tem as tabelas . O DB2 da IBM também suporta o predicado distinto de acordo com sua documentação .Infelizmente, parece que nem o Microsoft com SQL Server nem o Oracle com MySQL o suportam. Para o MySQL, é um recurso semelhante escrito como
<=>
.O SQL 1999 define um predicado distinto ( ISO/IEC 9075-2:1999 (E), seção 8.13 ) da seguinte maneira (casos para tipos de array não mostrados aqui, ligeiramente reformatados devido ao suporte de formatação restrito desta plataforma):
Assim, para o caso negado
is not distinct from
:TRUE
ouFALSE
NULL
, ele produzTRUE
NULL
, ele produzFALSE
=
segundo valor.Você deve se lembrar que NULL não é uma constante, mas sim uma incógnita. Você não pode ser igual a um desconhecido porque não sabe o valor de NULL.
Há uma resposta possível de que 'todos os SQL DBMS suportam
= NULL
', mas isso é verdade na cláusula SET de uma instrução UPDATE, não em um contexto que requer uma condicional. Esse contexto não aceitaria IS NULL, é claro (você não poderia escreverSET SomeCol IS NULL).