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

Bagaimana cara menulis ulang pernyataan SELECT ... CROSS JOIN LATERAL ... untuk versi PostgreSQL yang lebih lama?

PostgreSQL mendukung pemanggilan fungsi pengembalian set di SELECT ayat. Ini agak ditinggalkan sekarang karena kami memiliki LATERAL dan tentu saja tidak disarankan karena memiliki perilaku yang agak tidak menentu, tetapi tetap berguna.

Dalam kasus Anda, Anda dapat menulis:

SELECT 
  i.*,
  (partition_into_months(i.start_date, i.stop_or_current_date)).*
FROM invoicable_interval i;

Namun, ini dapat mengakibatkan satu panggilan ke partition_into_months per kolom dikembalikan karena (fn).* pada dasarnya diperluas secara makro menjadi (fn).col1, (fn).col2, ... . Untuk menghindari hal ini, Anda dapat membungkusnya dalam subquery, mis.

SELECT (x.i).*, (x.p).*
FROM
(
  SELECT 
    i,
    partition_into_months(i.start_date, i.stop_or_current_date) p
  FROM invoicable_interval i
) x(i,p);

Perhatikan bahwa hasil aneh akan ditemukan dengan adanya beberapa set fungsi pengembalian di SELECT daftar. Ini bukan cross-join seperti yang Anda harapkan. Misalnya, bandingkan:

SELECT generate_series(1,4), generate_series(1,4)

untuk

SELECT generate_series(1,4), generate_series(1,3);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Metode untuk menghapus penghapusan lunak dalam hubungan orang tua-anak

  2. Bagaimana cara memutakhirkan database postgresql dari 10 menjadi 12 tanpa kehilangan data untuk proyek terbuka

  3. python 2.7 ke python 3.4 kesalahan jenis operan yang tidak didukung untuk %:'bytes' dan 'dict'

  4. Buffer (Lingkaran) di PostGIS

  5. Postgres INSERT ON CONFLICT DO UPDATE vs INSERT or UPDATE