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

câu lệnh if với chuỗi chứa điều kiện

Từ những nhận xét cuối cùng tôi nghĩ rằng tôi đã hiểu. Bạn cần SQL động :

CREATE OR REPLACE FUNCTION foo(lastcontact timestamptz)
  RETURNS void AS
$func$
DECLARE
   myrec  record;
   mycond boolean;
BEGIN

FOR myrec IN
    SELECT * FROM tabel ORDER BY colorlevel, volgnummer
LOOP
    IF myrec.conditie ~~ '%lastcontact %' THEN   -- special case for input param
        myrec.conditie := replace (myrec.conditie
                        , 'lastcontact '
                        , CASE WHEN lastcontact IS NULL THEN 'NULL '
                          ELSE '''' || lastcontact::text || ''' ' END);
    END IF;

    EXECUTE 'SELECT ' || myrec.conditie || ' FROM tabel' INTO mycond;

    IF mycond then
        RAISE NOTICE 'Condition % is true', myrec.conditie;
    ELSE
        RAISE NOTICE 'Condition % is false', COALESCE(myrec.conditie, 'NULL');
    END IF;
END LOOP;

END
$func$  LANGUAGE plpgsql;

Tuy nhiên, hãy lưu ý rằng thiết lập này mở rộng cho SQL injection . Chỉ sử dụng đầu vào đã xác minh. Một hàm hoạt động trong PostgreSQL 8.3 nữa (không DO tuyên bố, chưa).

Bạn không thể tham chiếu đến các tham số bên trong SQL động (EXECUTE bản tường trình). Bạn phải đặt giá trị vào chuỗi truy vấn.

Trong PostgreSQL 8.4 trở lên, bạn có USING mệnh đề . Than ôi, không phải trong phiên bản 8.3. Bạn nên xem xét nâng cấp nếu có thể.

Tôi đã đưa ra một giải pháp thay thế cho phiên bản cũ của bạn. Bạn phải đặc biệt chăm sóc NULL giá trị.




  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 để truy cập postgresql trong Docker bằng sqlalchemy?

  2. Loại bỏ dấu ngoặc kép khỏi trường json một cách có chọn lọc trong PostgreSQL

  3. Truyền trực tuyến các hàng từ PostgreSQL (với kích thước tìm nạp)

  4. Bạn có quan sát thấy sự suy giảm hiệu suất của PostgreSQL TEMP TABLE kể từ 8.3 không?

  5. Sử dụng Hàm tương quan PostgreSQL