В GROUP BY
и ORDER BY
клауза можете да се позовавате на псевдоними на колони (изходни колони) или дори поредни номера на SELECT
списък с елементи. Цитирам ръководството на ORDER BY
:
Всеки израз може да бъде име или пореден номер на изходна колона (SELECT елемент от списъка) , или може да бъде произволен израз, образуван от стойности на входната колона.
Удебелен акцент мое.
Но в WHERE
и HAVING
клаузи, можете да се позовавате само на колони от базовите таблици (входни колони), така че трябва да напишете извикването на функцията си.
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;
Ако искате да знаете дали е по-бързо да опаковате изчислението в CTE или подзаявка, просто го тествайте с EXPLAIN ANALYZE
. (Съмнявам се.)
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;
Като коментира @Mike, като декларира функция STABLE
(или IMMUTABLE
) информирате планировщика на заявки, че резултатите от извикване на функция могат да бъдат използвани многократно за идентични повиквания в рамките на един израз. Цитирам ръководството тук:
Функция STABLE не може да модифицира базата данни и е гарантирана, че ще върне същите резултати при едни и същи аргументи за всички редове в рамките на един израз. Тази категория позволява на оптимизатора да оптимизира множество извиквания на функцията към едно извикване .
Удебелен акцент мое.