PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara menggunakan kembali hasil untuk klausa SELECT, WHERE dan ORDER BY?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara membandingkan tanggal di bidang datetime di Postgresql?

  2. PostgreSQL Buat Basis Data

  3. Paralel unnest() dan mengurutkan urutan di PostgreSQL

  4. Tipe Data PostgreSQL dan C#

  5. Masalah saat mengambil catatan dengan array kosong