I GROUP BY
och ORDER BY
sats du kan referera till kolumnalias (utdatakolumner) eller till och med ordningsnummer för SELECT
listobjekt. Jag citerar manualen på ORDER BY
:
Varje uttryck kan vara namnet eller ordningsnumret för en utdatakolumn (VÄLJ listobjekt) , eller så kan det vara ett godtyckligt uttryck bildat av indata-kolumnvärden.
Djärv betoning min.
Men i WHERE
och HAVING
satser, kan du bara hänvisa till kolumner från bastabellerna (indatakolumner), så du måste stava ditt funktionsanrop.
SELECT *, earth_distance(ll_to_earth(62.0, 25.0), ll_to_earth(lat, lon)) AS dist
FROM venues
WHERE earth_distance(ll_to_earth(62.0, 25.0), ll_to_earth(lat, lon)) <= radius
ORDER BY distance;
Om du vill veta om det går snabbare att packa beräkningen i en CTE eller underfråga, testa det bara med EXPLAIN ANALYZE
. (Jag tvivlar på det.)
SELECT *
FROM (
SELECT *
,earth_distance(ll_to_earth(62.0, 25.0), ll_to_earth(lat, lon)) AS dist
FROM venues
) x
WHERE distance <= radius
ORDER BY distance;
Som @Mike kommenterade, genom att deklarera en funktion STABLE
(eller IMMUTABLE
) informerar du frågeplaneraren att resultat från ett funktionsanrop kan återanvändas flera gånger för identiska anrop inom ett enda uttalande. Jag citerar manualen här:
En STABLE-funktion kan inte modifiera databasen och är garanterad att returnera samma resultat med samma argument för alla rader inom en enskild sats. Den här kategorin låter optimeraren optimera flera anrop av funktionen till ett enda anrop .
Djärv betoning min.