27 de septiembre de 2007

Inconsistencia de SELECT - SQL

Encontré la siguiente inconsistencia de SELECT-SQL que quiero compartir aquí. Prueben el siguiente código:

*-- primer ejemplo --
CREATE CURSOR prueba (texto c(15), numero I)
INSERT INTO prueba VALUES ("algo",9999)
SELECT SUM(numero) FROM prueba ;
  WHERE texto = "noexiste" ;
  INTO CURSOR primero
? sum_numero
BROWSE
*-----------------------------

Verán que el SELECT produce un resultado de un registro con un valor nulo en la columna sum_numero.

Sin embargo, si el SELECT se expresa de la siguiente forma:

*-- segundo ejemplo (con GROUP BY) --
SELECT texto, SUM(numero) FROM prueba ;
  WHERE texto = "noexiste" ;
  GROUP BY 1 ;
  INTO CURSOR segundo
? sum_numero
BROWSE
*-----------------------------

En este segundo ejemplo la consulta produce un resultado con cero registros y "? sum_numero" devuelve Cero (0) en vez de .NULL. como el primer ejemplo. Nótese entonces, que ambas consultas, siendo conceptualmente iguales, devuelven resultados diferentes.

Sin embargo, en VFP8, ambas formas producen el mismo resultado: sum_numero contiene cero, como en el segundo ejemplo.

La primera vez que noté que en VFP9, los casos como el primer ejemplo, me devolvían valores nulos si ningún registro satisface la condición WHERE, pensé que tenía sentido ese comportamiento. Es decir, traté de encontrarle un sentido que lo justifique. Me dije: “que la suma de todos los valores existentes sea igual a cero no es lo mismo a que no haya valores que sumar, en cuyo caso, devolver nulo aporta una información válida”. Lo acepté sin pensar mucho. Sin embargo, luego noté que no en todos los casos la ausencia de valores a sumar para satisfacer una condición WHERE devuelve un valor nulo. Entonces, esto ya debe ser clasificado como una inconsistencia, creo yo.

Además, y eso ya es un comentario aparte, en verdad que el valor nulo devuelto por el primer ejemplo no me sirve en ninguno de los casos prácticos en los que yo los utilizo. Así es que tuve que tomar el cuidado de utilizar SELECT siempre de la forma del segundo ejemplo.

Expongo este caso para que lo tomen en cuenta si todavía no lo han notado.

Saludos

Mario Esquivel Bado

No hay comentarios. :

Publicar un comentario