2013-07-24 15 views
23

Ho una domanda dentro uno stored procedure che somma dei valori in una tabella:ritorno zero se nessun record viene trovato

SELECT SUM(columnA) FROM my_table WHERE columnB = 1 INTO res; 

Dopo questo ristretto sottraggo res valore con un numero intero recuperato da un'altra query e restituire i risultato. Se la clausola WHERE è verificata, tutto funziona correttamente. Ma se non lo è, tutta la mia funzione restituisce è una colonna vuota (forse perché provo a sottrarre un intero con un valore vuoto).

Come posso rendere la mia query restituire zero se la clausola WHERE non è soddisfatta?

+0

'IN var' allegata alla' 'SELECT ... è valida solo nel codice PL/pgSQL, non in SQL pianura . Presumo che questo faccia parte di una funzione PL/pgSQL o dell'istruzione 'DO'. Corretta? –

risposta

46

Si potrebbe:

SELECT COALESCE(SUM(columnA), 0) FROM my_table WHERE columnB = 1 INTO res; 

Questo accade a lavorare, perché la ricerca ha una funzione di aggregazione e di conseguenza sempre restituisce una riga, anche se non si trova nella tabella sottostante.

query Plain senza aggregato tornavano nessuna riga in questo caso. COALESCE non verrebbe mai chiamato e non potrebbe salvarti. Mentre si occupano di una sola colonna si può avvolgere l'intera query invece:

SELECT COALESCE((SELECT columnA FROM my_table WHERE ID = 1), 0) 
INTO res; 

lavori per la query originale così:

SELECT COALESCE((SELECT SUM(columnA) FROM my_table WHERE columnB = 1), 0) 
INTO res; 

più su COALESCE() in the manual.
Ulteriori informazioni su aggregate functions in the manual.
Più alternative in questo post in seguito:

+1

@FreshPrinceOfSO: Penso che si debba notare che 'COALESCE' è il metodo * SQL standard * per farlo. –

+0

Ho avuto una [brutta esperienza] (http://dba.stackexchange.com/questions/46486/function-hangs-with-null-case-operation) con 'COALESCE' ... Diciamo solo che non siamo amici più. – Kermit

+3

@FreshPrinceOfSO È più di "Ho avuto una brutta esperienza con SQL Server", quindi "Ho avuto una brutta esperienza con COALESCE". Non c'è niente di sbagliato in 'COALESCE' in altri RDBMS. –

1

Non ho familiarità con PostgreSQL, ma in SQL Server o Oracle, utilizzando una subquery avrebbe funzionato come qui di seguito (in Oracle, il SELECT 0 sarebbe 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 

Forse questo dovrebbe funzionare per PostgreSQL troppo?

0

si può anche provare: (Ho provato questo e ha funzionato per me)

SELECT ISNULL((SELECT SUM(columnA) FROM my_table WHERE columnB = 1),0)) INTO res; 
Problemi correlati