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

PostgreSQL kiểm tra phần tử của bản ghi trước đó


Không hoạt động theo cách bạn có. Một chức năng cửa sổ không thể được gọi như vậy. Biến bản ghi của bạn r giống như một con trỏ tích hợp trong FOR vòng. Chỉ hàng hiện tại của kết quả được hiển thị bên trong vòng lặp. Bạn sẽ phải tích hợp chức năng cửa sổ lag() nó vào SELECT ban đầu .

Nhưng vì bạn vẫn đang lặp lại các hàng trong một thứ tự phù hợp, bạn có thể làm theo cách khác.

Hãy xem xét ví dụ được viết lại phần lớn này. Trả về ở hàng vi phạm đầu tiên:

CREATE OR REPLACE FUNCTION q8(_day date)
  RETURNS text AS
$BODY$
DECLARE
    r            record;
    last_enddate date;

BEGIN
FOR r IN
    SELECT *
       -- ,lag(r.endDate) OVER (ORDER BY startDate) AS last_enddate
       -- commented, because I supply an alternative solution
    FROM   periods
    ORDER  BY startDate
LOOP
    IF _day BETWEEN r.startDate AND r.endDate THEN
        RETURN 'Violates condition 1';  -- I return differing results
    ELSIF _day BETWEEN (r.startDate - 7) AND r.startDate THEN
        RETURN 'Violates condition 2';
    ELSIF _day BETWEEN last_enddate AND (r.startDate) THEN 
                                      -- removed "- 7 ", that is covered above
        RETURN 'Violates condition 3';
    END IF;

    last_enddate := r.enddate; -- remember for next iteration
END LOOP;

RETURN NULL;

END;
$BODY$ LANGUAGE plpgsql;

Thêm gợi ý

  • Tại sao lại đặt bí danh cho $1 ? Bạn đã đặt tên cho nó là _day trong phần khai báo đã có. Bám sát vào nó.
  • Đảm bảo biết cách PostgreSQL xử lý trường hợp trong số nhận dạng . (Tôi chỉ sử dụng chữ thường.)
  • Bạn chỉ có thể cộng / trừ các số nguyên (cho ngày) từ một ngày.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để pg_column_size nhỏ hơn octet_length?

  2. Cách AT TIME ZONE hoạt động trong PostgreSQL

  3. Lựa chọn lược đồ PostgreSQL thời gian chạy động trong jOOQ

  4. Làm cách nào để ngăn không cho PDO diễn giải dấu chấm hỏi dưới dạng trình giữ chỗ?

  5. Dự phòng &Dự phòng cho PostgreSQL trên Microsoft Azure