Dalam GROUP BY
dan ORDER BY
klausa Anda dapat merujuk ke alias kolom (kolom keluaran) atau bahkan nomor urut SELECT
Daftar item. Saya mengutip manual di ORDER BY
:
Setiap ekspresi dapat berupa nama atau nomor urut kolom keluaran (PILIH item daftar) , atau dapat berupa ekspresi arbitrer yang dibentuk dari nilai kolom input.
Penekanan saya yang berani.
Tapi di WHERE
dan HAVING
klausa, Anda hanya dapat merujuk ke kolom dari tabel dasar (kolom input), jadi Anda harus mengeja panggilan fungsi Anda.
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;
Jika Anda ingin tahu apakah lebih cepat untuk mengemas perhitungan ke dalam CTE atau subquery, cukup uji dengan EXPLAIN ANALYZE
. (Saya meragukannya.)
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;
Seperti komentar @Mike, dengan mendeklarasikan fungsi STABLE
(atau IMMUTABLE
) Anda memberi tahu perencana kueri bahwa hasil dari panggilan fungsi dapat digunakan kembali beberapa kali untuk panggilan identik dalam satu pernyataan. Saya mengutip manualnya di sini:
Fungsi STABLE tidak dapat mengubah database dan dijamin akan mengembalikan hasil yang sama dengan argumen yang sama untuk semua baris dalam satu pernyataan. Kategori ini memungkinkan pengoptimal untuk mengoptimalkan beberapa panggilan fungsi menjadi satu panggilan .
Penekanan saya yang berani.