Solución

Base de datos

Estrategía: Usar <>(!=) y IS NULL

Intuición

Algunas personas llegan a la siguiente solución en base a su intuición.

SELECT name FROM customer WHERE referee_Id <> 2;

Sin embargo, esta consulta solo regresa un resultado: Zack aunque hay 4 clientes no referidos por Jane (incluyéndose asi misma). Todos los clientes que no fueron referidos (aquellos con valor NULL en la columna referee_id) no se muestran. ¿Pero por qué sucede esto?

Algoritmo

MySQL usa lógica de tres valores — TRUE, FALSE y UNKNOWN. Cualquier cosa comparada con NULL se evalúa al tercer valor: UNKNOWN. Ese “cualquier cosa” incluye al propio NULL. Por eso MySQL proporciona las operaciones IS NULL y IS NOT NULL para comprobar específicamente NULL.

Por tanto, una condición más referee_id IS NULL necesita ser agregada a la cláusula WHERE como se muestra en seguida.

Implementación
SELECT name FROM customer WHERE referee_id <> 2 OR referee_id IS NULL;

Otra solución válida

SELECT name FROM customer WHERE referee_id != 2 OR referee_id IS NULL;
Consejos

La siguiente solución también es incorrecta por la misma razón mencionada antes. La clave es siempre usar los operadores IS NULL ó IS NOT NULL para explícitamente verificar que el valor es o no NULL.

SELECT name FROM customer WHERE referee_id = NULL OR referee_id <> 2;

slackmart blog © 2024