PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Đặt giá trị trả về mặc định cho hàm Postgres

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:

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cài đặt psycopg2 trên Ubuntu

  2. org.postgresql.util.PSQLException:LỖI:app_user quan hệ không tồn tại

  3. Chức năng cửa sổ PostgreSQL:phân vùng theo so sánh

  4. Làm cách nào để tạo Dạng xem SQL với SQLAlchemy?

  5. Hệ thống lại khóa ngoại cho các trường