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

Tetapkan nilai pengembalian default untuk fungsi Postgres

Anda perlu mengubah bahasa dari sql ke plpgsql jika Anda ingin menggunakan fitur prosedural PL/pgSQL. Tubuh fungsi juga berubah.

Ketahuilah bahwa semua nama parameter terlihat di badan fungsi , termasuk semua level pernyataan SQL. Jika Anda membuat konflik penamaan, Anda mungkin perlu mengkualifikasikan nama kolom seperti ini:table.col , untuk menghindari kebingungan. Karena Anda merujuk ke parameter fungsi dengan referensi posisi ($n ) lagi pula, saya baru saja menghapus nama parameter untuk membuatnya berfungsi.

Terakhir, THEN tidak ada di IF pernyataan - penyebab langsung dari pesan kesalahan .

Seseorang dapat menggunakan COALESCE untuk menggantikan NULL nilai-nilai. Tapi itu hanya berfungsi jika setidaknya ada satu baris yang dihasilkan. COALESCE tidak dapat memperbaiki "tidak ada baris" itu hanya dapat menggantikan NULL yang sebenarnya nilai.

Ada beberapa cara untuk menutupi semua NULL kasus. Dalam fungsi plpgsql :

CREATE OR REPLACE FUNCTION point_total(integer, date, OUT result bigint)
  RETURNS bigint AS
$func$
BEGIN

SELECT sum(p.points)          -- COALESCE would make sense ...
INTO   result
FROM   picks p
WHERE  p.user_id = $1
AND    p.gametime > $2
AND    p.points IS NOT NULL;  -- ... if NULL values were not ruled out

IF NOT FOUND THEN             -- If no row was found ...
   result := 0;               -- ... set to 0 explicitly
END IF;

END
$func$  LANGUAGE plpgsql;

Atau Anda dapat menyertakan seluruh kueri dalam COALESCE ekspresi dalam SELECT outer luar . "Tidak ada baris" dari SELECT bagian dalam menghasilkan NULL dalam ekspresi. Bekerja sebagai SQL biasa, atau Anda dapat membungkusnya dalam fungsi sql :

CREATE OR REPLACE FUNCTION point_total(integer, date)
  RETURNS bigint AS
$func$
SELECT COALESCE(
  (SELECT sum(p.points)
   FROM   picks p
   WHERE  p.user_id = $1
   AND    p.gametime > $2
   -- AND    p.points IS NOT NULL  -- redundant here
  ), 0)
$func$  LANGUAGE sql;

Jawaban terkait:

Mengenai konflik penamaan

Satu masalah adalah konflik penamaan yang paling mungkin terjadi. Ada perubahan besar di versi 9.0 . Saya mengutip catatan rilis :

Versi selanjutnya telah menyempurnakan perilaku. Di tempat yang jelas, alternatif yang tepat dipilih secara otomatis. Mengurangi potensi konflik, tetapi tetap ada. Saran masih berlaku di Postgres 9.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. kapan harus memutuskan dan kapan harus mengakhiri pg client atau pool

  2. PostgreSQL- Filter rentang tanggal

  3. PostgreSQL - Menghapus data yang lebih lama dari satu jam, lalu memasukkan data baru ke tabel yang sama

  4. Cara Membuat API GraphQL Tanpa Server untuk MySQL, Postgres, dan Aurora

  5. Bagaimana cara membuat pendengar basis data dengan java?