Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Esta implementação está em conformidade com o SQL-92?


Não, o tratamento de nulos da Oracle é idiossincrático, diferente de todos os outros e inconsistente com os padrões ANSI. Em defesa da Oracle, no entanto, ela provavelmente se estabeleceu e se comprometeu com esse tratamento muito antes de haver um padrão ANSI para ser consistente!

Tudo começa com o fato de que o Oracle armazena strings com uma contagem de caracteres seguida pelos dados da string. Um NULL é representado por uma contagem de caracteres de zero sem nenhum dado de string a seguir - que é exatamente o mesmo que uma string vazia (''). A Oracle simplesmente não tem como distingui-los.

Isso leva a algum comportamento peculiar, como este caso de concatenação. O Oracle também possui uma função LENGTH para retornar o comprimento de uma string, mas isso foi definido de maneira oposta, de modo que LENGTH('') retorne NULL e não zero. Então:
LENGTH('abc') + LENGTH('') IS NULL

LENGTH('abc' || '') = 3

que me parece violar princípios matemáticos básicos.

É claro que os desenvolvedores Oracle ficam tão acostumados com isso que muitos de nós não conseguem ver nada de errado ou estranho sobre isso - alguns de fato argumentam que o resto do mundo está errado e que uma string vazia e um NULL são a mesma coisa!