W GROUP BY
i ORDER BY
klauzula, do której możesz się odwoływać aliasy kolumn (kolumny wyjściowe) lub nawet liczby porządkowe SELECT
Lista przedmiotów. Cytuję instrukcję na ORDER BY
:
Każde wyrażenie może być nazwą lub numerem porządkowym kolumny wyjściowej (element listy SELECT) , lub może to być dowolne wyrażenie utworzone z wartości w kolumnie wejściowej.
Pogrubiony nacisk na moje.
Ale w WHERE
i HAVING
klauzul, możesz odwoływać się tylko do kolumn z tabel bazowych (kolumn wejściowych), więc musisz przeliterować wywołanie funkcji.
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;
Jeśli chcesz wiedzieć, czy szybciej spakować obliczenia do CTE lub podzapytania, po prostu przetestuj je za pomocą EXPLAIN ANALYZE
. (Wątpię.)
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;
Jak skomentował @Mike, deklarując funkcję STABLE
(lub IMMUTABLE
) informujesz planistę zapytań, że wyniki wywołania funkcji mogą być wielokrotnie użyte w przypadku identycznych wywołań w ramach jednej instrukcji. Cytuję instrukcję tutaj:
Funkcja STABILNA nie może modyfikować bazy danych i gwarantuje, że zwróci te same wyniki przy tych samych argumentach dla wszystkich wierszy w ramach jednej instrukcji. Ta kategoria pozwala optymalizatorowi na optymalizację wielu wywołań funkcji do jednego wywołania .
Pogrubiony nacisk na moje.