La cláusula NULL
en SQL causa frecuentes confusiones.
El concepto básico detrás de NULL
es sencillo: se usa para representar un dato ausente;
para representar un dato
ausente; existen, sin embargo, algunas peculiaridades.
Tienes que usar IS NULL
en lugar de = NULL
,
por ejemplo. Además, la base de datos Oracle tiene una singularidad
adicional para NULL
: por una parte, no le otorga el significado
tal como el estándar requiere y por otra parte: tiene
un comportamiento “raro” con los NULL
dentro de los
índices.
El estándar SQL no define NULL
como un valor, sino más
bien como un marcador de posición para un valor ausente o desconocido. Por
consiguiente, ningún valor puede ser NULL
. En su lugar, la
base de datos Oracle trata las cadenas de caracteres vacías como
NULL
:
SELECT '0 IS NULL???' AS "what is NULL?" FROM dual
WHERE 0 IS NULL
UNION ALL
SELECT '0 is not null' FROM dual
WHERE 0 IS NOT NULL
UNION ALL
SELECT ''''' IS NULL???' FROM dual
WHERE '' IS NULL
UNION ALL
SELECT ''''' is not null' FROM dual
WHERE '' IS NOT NULL
Para agregar un poco más de confusión, existe también un caso en el
que la base de datos Oracle trata los NULL
como cadenas de
caracteres vacías.
SELECT dummy
, dummy || ''
, dummy || NULL
FROM dual
D D D
- - -
X X X
Concatenar la columna DUMMY
(siempre contiene
'X'
) con NULL
podría traer
NULL
.
El concepto de NULL
se utiliza en muchos lenguajes de
programación. No importa dónde se vea, una cadena de caracteres nunca es
un NULL
excepto en la base de datos Oracle. Es, de hecho,
imposible almacenar una cadena de caracteres vacía dentro de un campo
VARCHAR
. Si se intenta, la base de datos Oracle almacena
solamente un NULL
.
Esta peculiaridad no es solo rara, sino que también peligrosa.
Además, la peculiaridad de Oracle con NULL
no se queda aquí,
continúa con los índices.
Si te gusta mi manera de explicar, te encantará mi libro.