V GROUP BY
a ORDER BY
klauzule můžete odkazovat na aliasy sloupců (výstupní sloupce) nebo dokonce na pořadová čísla SELECT
seznam položek. Cituji manuál na ORDER BY
:
Každý výraz může být název nebo pořadové číslo výstupního sloupce (položka seznamu SELECT) , nebo to může být libovolný výraz vytvořený z hodnot vstupního sloupce.
Tučné zdůraznění moje.
Ale v WHERE
a HAVING
klauzule, můžete odkazovat pouze na sloupce ze základních tabulek (vstupní sloupce), takže musíte upřesnit volání funkce.
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;
Pokud chcete vědět, zda je rychlejší zabalit výpočet do CTE nebo poddotazu, otestujte jej pomocí EXPLAIN ANALYZE
. (O tom pochybuji.)
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 poznamenal @Mike, deklarováním funkce STABLE
(nebo IMMUTABLE
) informujete plánovač dotazů, že výsledky volání funkce lze opakovaně použít pro identická volání v rámci jednoho příkazu. Zde cituji manuál:
Funkce STABLE nemůže modifikovat databázi a je zaručeno, že vrátí stejné výsledky se stejnými argumenty pro všechny řádky v jediném příkazu. Tato kategorie umožňuje optimalizátoru optimalizovat více volání funkce na jediné volání .
Tučné zdůraznění moje.