Bạn cần thay đổi ngôn ngữ từ sql
tới plpgsql
nếu bạn muốn sử dụng các tính năng thủ tục của PL / pgSQL. Thân chức năng cũng thay đổi.
Lưu ý rằng tất cả các tên tham số đều hiển thị trong thân hàm , bao gồm tất cả các cấp của câu lệnh SQL. Nếu bạn tạo xung đột đặt tên, bạn có thể cần đặt tên cột đủ điều kiện cho bảng như sau:table.col
, để tránh nhầm lẫn. Vì bạn tham chiếu đến các tham số hàm bằng tham chiếu vị trí ($n
) dù sao, tôi chỉ xóa tên tham số để làm cho nó hoạt động.
Cuối cùng, THEN
bị thiếu trong IF
tuyên bố - nguyên nhân ngay lập tức của thông báo lỗi .
Người ta có thể sử dụng COALESCE để thay thế cho NULL
các giá trị. Nhưng điều đó chỉ hoạt động nếu có ít nhất một hàng kết quả. COALESCE
không thể sửa lỗi "no row" nó chỉ có thể thay thế NULL
thực tế giá trị.
Có một số cách để bao gồm tất cả NULL
các trường hợp. Trong hàm 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;
Hoặc bạn có thể đặt toàn bộ truy vấn trong COALESCE
biểu thức trong SELECT
bên ngoài . "Không có hàng" từ SELECT
bên trong kết quả là NULL
trong biểu thức. Làm việc như SQL thuần túy hoặc bạn có thể bọc nó trong một hàm 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;
Câu trả lời liên quan:
- Làm cách nào để hiển thị giá trị mặc định khi không tìm thấy kết quả phù hợp nào trong một truy vấn?
Liên quan đến xung đột đặt tên
Một vấn đề rất có thể xảy ra là xung đột đặt tên. Đã có những thay đổi lớn trong phiên bản 9.0 . Tôi trích dẫn ghi chú phát hành :
Các phiên bản sau này đã tinh chỉnh hành vi. Ở những vị trí rõ ràng, giải pháp thay thế phù hợp được chọn tự động. Giảm khả năng xảy ra xung đột, nhưng nó vẫn ở đó. Lời khuyên vẫn được áp dụng trong Postgres 9.3.