sql - válido - restricción de tipo check
Devuelve cero si no se encuentra ningún registro (3)
Tengo una consulta dentro de un procedimiento almacenado que resume algunos valores dentro de una tabla:
SELECT SUM(columnA) FROM my_table WHERE columnB = 1 INTO res;
Después de esto, selecciono restar el valor de res
con un entero recuperado por otra consulta y devolver el resultado. Si se verifica la cláusula WHERE
, todo funciona bien. Pero si no lo es, toda mi función devuelve una columna vacía (tal vez porque trato de restar un entero con un valor vacío).
¿Cómo puedo hacer que mi consulta devuelva cero si no se cumple la cláusula WHERE
?
No estoy familiarizado con postgresql, pero en SQL Server u Oracle, usar una subconsulta funcionaría como a continuación (en Oracle, SELECT 0
sería SELECT 0 FROM DUAL
)
SELECT SUM(sub.value)
FROM
(
SELECT SUM(columnA) as value FROM my_table
WHERE columnB = 1
UNION
SELECT 0 as value
) sub
¿Tal vez esto también funcionaría para postgresql?
También puedes probar: (Intenté esto y funcionó para mí)
SELECT ISNULL((SELECT SUM(columnA) FROM my_table WHERE columnB = 1),0)) INTO res;
Tú podrías:
SELECT COALESCE(SUM(columnA), 0) FROM my_table WHERE columnB = 1 INTO res;
Esto sucede porque su consulta tiene una función agregada y, en consecuencia, siempre devuelve una fila, incluso si no se encuentra nada en la tabla subyacente.
Las consultas simples sin agregado no devolverían ninguna fila en tal caso. COALESCE
nunca sería llamado y no podría salvarte. Al tratar con una sola columna, podemos envolver toda la consulta en su lugar:
SELECT COALESCE( (SELECT columnA FROM my_table WHERE ID = 1), 0)
INTO res;
Funciona para su consulta original también:
SELECT COALESCE( (SELECT SUM(columnA) FROM my_table WHERE columnB = 1), 0)
INTO res;
Más sobre COALESCE()
en el manual .
Más sobre las funciones agregadas en el manual .
Más alternativas en esta publicación posterior: