índice válido usarse una tipo tabla restricción restriccion que permitir para ejemplo duplicados crear como columna clave checkident check sql postgresql null plpgsql coalesce

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: