Uitleg
De kern van het probleem is de vage definitie van "niets".
NULL
is niet niets , het is alleen niet bekend wat het precies is. "Niets" in termen van SQL zou zijn geen rij :er wordt helemaal niets geretourneerd. Dat gebeurt meestal als er geen rij wordt gevonden. Maar bij gebruik van geaggregeerde functies , dat kan niet gebeuren omdat, per documentatie:
avg()
retourneert NULL
wanneer er geen rijen worden gevonden (dus niet "niets"). Je krijgt een rij met een NULL
waarde als resultaat - dat overschrijft uw init-waarde in de code die u demonstreert.
Oplossing
Wikkel het resultaat in COALESCE
. Een veel eenvoudigere SQL-functie demonstreren:
CREATE OR REPLACE FUNCTION get_height_sql(firstn varchar, lastn varchar)
RETURNS float AS
$func$
SELECT COALESCE(AVG(((p.h_feet * 12) + p.h_inches) * 2.54)::float, 0)
FROM player p
WHERE p.firstname = firstn
AND p.lastname = lastn
$func$ LANGUAGE sql STABLE;
Hetzelfde kan worden gebruikt in een plpgsql-functie. Deze functie kan STABLE
. zijn , kan helpen bij de prestaties in de context van grotere zoekopdrachten.
Andere gevallen
Als je echt kunt krijg geen rij van een zoekopdracht, een eenvoudige COALESCE
zou mislukken , omdat het nooit wordt uitgevoerd.
Voor een enkele waarde resultaat, je kunt de hele zoekopdracht gewoon inpakken zoals:
SELECT COALESCE((SELECT some_float FROM ... WHERE ... LIMIT 1), 0) AS result
PL/pgSQL heeft de mogelijkheid om te controleren voordat het daadwerkelijk terugkeert van de functie. Dit werkt voor meerdere rijen met een of meer kolommen , te. Er is een voorbeeld in de handleiding
demonstreren van het gebruik van FOUND
:
...
RETURN QUERY SELECT foo, bar ...;
IF NOT FOUND THEN
RETURN QUERY VALUES ('foo_default'::text, 'bar_default'::text);
END IF;
...
Gerelateerd:
- Return setof record ( virtuele tafel) van functie
- PostgreSQL - Controleer of de externe sleutel bestaat bij het uitvoeren van een SELECT
Altijd precies één rij teruggeven , kunt u ook pure SQL . gebruiken :
SELECT foo, bar FROM tbl
UNION ALL
SELECT 'foo_default', 'bar_default'
LIMIT 1;
Als de eerste SELECT
geeft geen rij terug, de tweede SELECT
geeft een rij met standaardwaarden terug.