I GROUP BY
og ORDER BY
klausul, du kan henvise til kolonnealiaser (outputkolonner) eller endda ordenstal for SELECT
listeelementer. Jeg citerer manualen på ORDER BY
:
Hvert udtryk kan være navnet eller ordensnummeret på en outputkolonne (VÆLG listeelement) , eller det kan være et vilkårligt udtryk dannet ud fra input-kolonneværdier.
Fed fremhævelse mine.
Men i WHERE
og HAVING
klausuler, kan du kun henvise til kolonner fra basistabellerne (input kolonner), så du skal stave dit funktionskald.
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;
Hvis du vil vide, om det er hurtigere at pakke beregningen ind i en CTE eller underforespørgsel, skal du bare teste den med EXPLAIN ANALYZE
. (Jeg tvivler 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;
Ligesom @Mike kommenterede, ved at erklære en funktion STABLE
(eller IMMUTABLE
) informerer du forespørgselsplanlæggeren om, at resultater fra et funktionskald kan genbruges flere gange til identiske opkald inden for en enkelt erklæring. Jeg citerer manualen her:
En STABLE funktion kan ikke ændre databasen og er garanteret at returnere de samme resultater givet de samme argumenter for alle rækker i en enkelt sætning. Denne kategori giver optimeringsværktøjet mulighed for at optimere flere opkald af funktionen til et enkelt opkald .
Fed fremhævelse mine.