2013-07-24 8 views
23

Ich habe eine Abfrage innerhalb einer gespeicherten Prozedur, die einige Werte in einer Tabelle fasst gefunden:Null zurück, wenn keine Aufzeichnung

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

Nach dieser Auswahl I res Wert mit einer ganzen Zahl durch eine andere Abfrage abgerufen subtrahieren und kehren die Ergebnis. Wenn WHERE Klausel verifiziert wird, funktioniert alles einwandfrei. Aber wenn das nicht der Fall ist, ist meine ganze Funktion eine leere Spalte (vielleicht weil ich versuche, eine ganze Zahl mit einem leeren Wert zu subtrahieren).

Wie kann ich meine Abfrage Null zurückgeben, wenn die WHERE Klausel nicht erfüllt ist?

+0

'IN var' angefügt SELECT ...' ist nur gültig in PL/pgSQL-Code, nicht in einfacher SQL . Ich nehme an, das ist Teil einer PL/pgSQL-Funktion oder "DO" -Anweisung. Richtig? –

Antwort

46

Sie könnten:

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

Dies geschieht zu arbeiten, weil Sie Ihre Abfrage eine Aggregatfunktion hat und folglich immer gibt eine Reihe, auch wenn nichts in der zugrunde liegenden Tabelle zu finden ist.

Plain Abfragen ohne Aggregat würde keine Zeile in einem solchen Fall zurückgeben. COALESCE würde niemals aufgerufen werden und könnte Sie nicht retten. Während mit einer einzigen Spalte tun können wir die gesamte Abfrage wickeln statt:

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

Works für Ihre ursprüngliche Abfrage auch:

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

Mehr über COALESCE() in the manual.
Mehr über aggregate functions in the manual.
Mehr Alternativen in diesem späteren Beitrag:

+1

@FreshPrinceOfSO: Ich denke, es sollte angemerkt werden, dass 'COALESCE' der * SQL Standard * Weg ist, es zu tun. –

+0

Ich hatte eine [schlechte Erfahrung] (http://dba.stackexchange.com/questions/46486/function-hangs-with-null-case-operation) mit 'COALESCE' ... Sagen wir einfach, wir sind keine Freunde nicht mehr. – Kermit

+3

@FreshPrinceOfSO Es ist mehr von 'Ich hatte eine schlechte Erfahrung mit SQL Server' dann 'Ich hatte eine schlechte Erfahrung mit COALESCE'. Mit "COALESCE" in anderen RDBMS ist nichts verkehrt. –

1

Ich bin mit postgresql nicht vertraut, aber in SQL Server oder Oracle, wie unter einer Unterabfrage (in Oracle funktionieren würde, die SELECT 0 wäre 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 

Vielleicht wäre dies auch für postgresql arbeiten?

0

Sie können auch versuchen: (ich das ausprobiert und es funktioniert für mich)

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