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.