sql >> Base de Datos >  >> RDS >> Oracle

¿Es esta implementación conforme a SQL-92?

No, el tratamiento de los nulos por parte de Oracle es idiosincrásico, diferente al de todos los demás e inconsistente con los estándares ANSI. Sin embargo, en defensa de Oracle, probablemente se decidió y se comprometió con este tratamiento mucho antes de que existiera un estándar ANSI con el que ser coherente.

Todo comienza con el hecho de que Oracle almacena cadenas con un conteo de caracteres seguido de los datos de la cadena. Un NULL está representado por un recuento de caracteres de cero sin datos de cadena siguientes, que es exactamente lo mismo que una cadena vacía (''). Oracle simplemente no tiene forma de distinguirlos.

Esto conduce a un comportamiento peculiar, como este caso de concatenación. Oracle también tiene una función LONGITUD para devolver la longitud de una cadena, pero se ha definido de manera opuesta, de modo que LONGITUD('') devuelve NULL y no cero. Entonces:

LENGTH('abc') + LENGTH('') IS NULL

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

lo que me parece violar los principios matemáticos básicos.

Por supuesto, los desarrolladores de Oracle se acostumbraron tanto a esto que muchos de nosotros ni siquiera podemos ver nada malo o extraño al respecto; de hecho, algunos argumentarán que el resto del mundo está equivocado y que una cadena vacía y un NULL son ¡Lo mismo!