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関数はデータベースを変更できず、単一のステートメント内のすべての行に同じ引数が与えられた場合に同じ結果を返すことが保証されています。このカテゴリは、オプティマイザが関数の複数の呼び出しを1つの呼び出しに最適化することを可能にします 。
大胆な強調鉱山。