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

Chuyển mảng thẻ cho một hàm plpgsql và sử dụng nó trong điều kiện WHERE

Bạn không thực sự quay trở lại kết quả. Bạn sẽ sử dụng RETURN QUERY EXECUTE cho điều đó. Ví dụ:

Nhưng bạn không cần SQL động ở đây để bắt đầu bằng ...

CREATE OR REPLACE FUNCTION get_items_by_tag(VARIADIC tags text[])
  RETURNS TABLE (id int, title text, tag text[]) AS
$func$
BEGIN
   IF array_length(tags, 1) > 0 THEN
      -- NO need for EXECUTE
      RETURN QUERY
      SELECT d.id, d.title, array_agg(t.title)
      FROM   items d
      JOIN   item_tags dt ON dt.item_id = d.id
      JOIN   tags t       ON t.id = dt.tag_id
      AND    t.title = ANY ($1)     -- use ANY construct
      GROUP  BY d.id;               -- PK covers whole table
      -- array_to_string(tags, ',') -- no need to convert array with ANY
-- ELSE ...
   END IF;
END
$func$  LANGUAGE plpgsql;

Gọi với mảng thực tế:

SELECT * FROM get_items_by_tag(VARIADIC '{tag1,tag2}'::text[]);

Hoặc gọi kèm theo danh sách các mục ("từ điển"):

SELECT * FROM get_items_by_tag('tag1', 'tag2');

Những điểm chính

Không chắc tại sao bạn có IF array_length(tags, 1) > 0 THEN , nhưng có thể được thay thế bằng thẻ IF tags IS NOT NULL THEN hoặc không có IF hoàn toàn và theo dõi với IF NOT FOUND THEN . Thêm:



  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ách mã hóa một cột trong Postgres bằng Hibernate @ColumnTransformer

  2. Làm cách nào để thay đổi quyền sở hữu của một số bảng bên trong cơ sở dữ liệu từ postgres sang người dùng khác?

  3. Tính toán và tiết kiệm dung lượng trong PostgreSQL

  4. Chuyển đổi mảng đối tượng thành mảng tương thích cho nodejs / pg / unnest

  5. Làm cách nào để thực hiện truy vấn LIKE cho khóa jsonb?