AUTOR: Mateo Domínguez Gómez
El uso de la estructura CASE
en consultas SQL puede ser una herramienta poderosa para obtener diferentes resultados en función de un conjunto de condiciones. Sin embargo, en ocasiones se puede abusar de su uso, lo que puede llevar a código menos eficiente o incluso incorrecto.
En esta entrada, exploraremos tres ejemplos comunes de abuso de la estructura CASE y cómo evitarlos para mejorar la claridad y eficiencia de nuestras consultas.
1. Contar datos no nulos
Es común encontrar consultas que emplean CASE
para contar la cantidad de registros con valores no nulos en una columna.
SELECT COUNT(CASE
WHEN salario IS NOT NULL THEN 1
END) AS "total_registros_con_salario"
FROM empleado;
Sin embargo, este uso de CASE
es innecesario. La función COUNT
ya ignora los valores nulos. Por lo tanto, podemos obtener el mismo resultado de forma más simple:
SELECT COUNT(salario) AS "total_registros_con_salario"
FROM empleado;
2. Reemplazar valores nulos
Otra situación común es usar CASE
para reemplazar valores nulos por un valor predeterminado, como "Sin asignar":
SELECT CASE
WHEN salario IS NULL THEN "Sin asignar"
ELSE salario
END AS ‘salario’
FROM empleado;
En este caso, en lugar de utilizar CASE
, podemos usar la función COALESCE
para obtener el mismo resultado de forma más concisa:
SELECT COALESCE(salario, 'Sin asignar') AS "salario"
FROM empleado;
3. Filtrar y calcular en una sola consulta
En ocasiones se utiliza CASE
para realizar cálculos sobre un subconjunto de tuplas dentro de la misma consulta. Por ejemplo, para calcular el salario medio de los empleados que ganan entre 2000 y 3000 euros (para exagerar el ejemplo, en lugar de usar la función AVG
para obtener la media, se ha optado por sumar y dividir por la cantidad de valores):
SELECT SUM(CASE
WHEN salario BETWEEN 2000 AND 3000 THEN salario
END) / COUNT(CASE
WHEN salario BETWEEN 2000 AND 3000 THEN 1
END) AS "salario_medio"
FROM empleado;
Este código es complejo y difícil de leer. Además, puede ser muy ineficiente si la proporción de filas sobre la que se debe hacer el cálculo (en este caso las que tienen un salario entre 2000 y 3000) es pequeña en relación al total de tuplas. Con la solución propuesta, el gestor de la BD tiene que procesar datos de empleados que no se incluyen en el resultado final (de hecho, procesa todas las filas de la tabla, que podrían ser millones). En su lugar, podemos dividir la lógica en dos pasos: primero, filtrar los empleados que cumplen la condición y luego calcular el salario medio solo sobre los seleccionados:
SELECT SUM(salario) / COUNT(*) AS "salario_medio"
FROM empleado
WHERE salario BETWEEN 2000 AND 3000;
Esta consulta es más limpia y eficiente, puesto que al filtrar con WHERE
se reduce el conjunto de datos sobre el cual se realizarán los cálculos. Así, el gestor de la BD solo procesa los datos que son relevantes para el resultado final.
Conclusiones
En resumen, es importante usar la estructura CASE de forma consciente y evitar su uso innecesario. De esta forma, se logra escribir consultas SQL más simples, eficientes y fáciles de entender.
No hay comentarios:
Publicar un comentario