it-swarm.com.de

Gibt Null zurück, wenn kein Datensatz gefunden wird

Ich habe eine Abfrage in einer gespeicherten Prozedur, die einige Werte in einer Tabelle summiert:

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

Danach wählen Sie Ich subtrahiere res mit einer Ganzzahl, die von einer anderen Abfrage abgerufen wurde, und gebe das Ergebnis zurück. Wenn die WHERE -Klausel überprüft wird, funktioniert alles einwandfrei. Wenn dies nicht der Fall ist, gibt meine Funktion nur eine leere Spalte zurück (möglicherweise, weil ich versuche, eine Ganzzahl mit einem leeren Wert zu subtrahieren).

Wie kann ich meine Abfrage auf Null setzen, wenn die WHERE -Klausel nicht erfüllt ist?

30
giozh

Du könntest:

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

Dies funktioniert, weil Ihre Abfrage eine Aggregatfunktion hat und folglich always eine Zeile zurückgibt, auch wenn in der zugrunde liegenden Tabelle nichts gefunden wird.

Einfache Abfragen ohne Aggregat würden in einem solchen Fall keine Zeile zurückgeben. COALESCE würde niemals aufgerufen werden und könnte dich nicht retten. Wenn wir uns mit einer einzelnen Spalte befassen, können wir stattdessen die gesamte Abfrage umbrechen:

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

Funktioniert auch für Ihre ursprüngliche Abfrage:

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

Mehr über COALESCE() im Handbuch .
Mehr über Aggregatfunktionen im Handbuch .
Weitere Alternativen in diesem späteren Beitrag:

57

Ich kenne mich mit postgresql nicht aus, aber in SQL Server oder Oracle würde die Verwendung einer Unterabfrage wie folgt funktionieren (in Oracle ist 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ürde dies auch für postgresql funktionieren?

3
Jim

Sie können auch versuchen: (Ich habe es versucht und es hat bei mir funktioniert)

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