lunes, 30 de diciembre de 2013

El problema de los valores NULL [1]

En varios foros he encontrado consultas que tienen en común el uso de filtros que involucran valores nulos. Previo a la discusión, refrescaremos algunos conceptos propios del modelo de datos relacional.

Los valores nulos (NULL de ahora en adelante) son utilizados en bases de datos para representar información desconocida. Este valor es independiente del tipo de datos que se utilice, por tanto, es posible asignar el valor NULL a atributos numéricos, alfanuméricos y temporales. Algunas personas confunden el NULL con una cadena de caracteres de longitud cero o con un entero cuyo valor es cero. Esto no es correcto ya que una cadena de longitud cero, es una cadena que no posee caracteres (pero que posee un valor) mientras que una cadena que es NULL simplemente es una cadena que no posee información.

Las comparaciones de valores NULL no pueden ser realizadas con los operadores clásicos (mayor, menor, distinto, etc.) ya que éstos pertenecen a la lógica binaria (verdadero - falso). Ya que la lógica utilizada por el esquema relacional es trivaluada (verdadero - falso - desconocido), cualquier comparación de un valor por NULL mediante los operadores clásicos fallará. Las cláusulas IS NULL y IS NOT NULL verifican respectivamente si un valor es NULL o si un valor no es NULL. En realidad es sólo una cláusula, pero una es la negación de la otra.

Seguidamente se dan algunos ejemplos con algunos valores y condiciones.


ValoresCondiciónResultado
A = NULL, B = 5A = NULL AND B = 5Desconocido. «A» no puede compararse con «igual» ya que su valor es NULL. «A» debe compararse así «A IS NULL».
A = NULL, B = 5A IS NULL AND B = 5Cierto.
A = NULL, B = 8A IS NULL AND B = 9Falso. B vale 8, no 9.
A = NULL, B = 7A IS NULL AND B IS NOT NULLCierto.
A = 7A IS NOT NULLCierto.
A = NULL, B = 4A IS NULL AND B >= 3Cierto.
A = NULL, B = 5A IS NULL AND B NULLDesconocido. «B» debe compararse así «B IS NOT NULL»

Para efectos prácticos, aquellos casos cuyo resultado sea «Desconocido», se comportan como un «Falso». Esto trae efectos nocivos en consultas que usen operadores clásicos en valores NULL.

No hay comentarios: