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

Liên tục chèn tất cả các kết hợp duy nhất gặp phải của ba ID

Như @a_horse_with_no_name đã nêu:Hàm unnest () làm phẳng không chỉ thứ nguyên đầu tiên mà tất cả các phần tử lồng nhau. Vì vậy, nó tạo ra một hàng cho mỗi số nguyên. Điều đó, tất nhiên dẫn đến một cột có (trong trường hợp của bạn) sáu giá trị. Đây là ý nghĩa của thông báo ngoại lệ:Bạn tạo một cột nhưng dự kiến ​​sẽ có ba cột.

Vì vậy, bạn cần một giải pháp để chỉ giải phóng chiều thứ nhất. Tôi đang sử dụng các giải pháp được trình bày tại đây :

demo:db <> fiddle

Tạo hàm Lukas ':

CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
  RETURNS SETOF anyarray AS
$func$
SELECT array_agg($1[d1][d2])
FROM   generate_subscripts($1,1) d1
    ,  generate_subscripts($1,2) d2
GROUP  BY d1
ORDER  BY d1
$func$  LANGUAGE sql IMMUTABLE;

Đây chỉ là chiều thứ nhất mà không cần lưu ý. Vì vậy, bạn có thể sử dụng nó thay vì thử unnest () trong hàm của bạn:

CREATE OR REPLACE function create_combinations_if_needed(p_combinations integer[][]) RETURNS boolean
LANGUAGE sql AS
$$
   INSERT INTO combinations (some_id1, some_id2, some_id3)
   SELECT unnest[1], unnest[2], unnest[3]
   FROM unnest_2d_1d(p_combinations) as unnest
   ON CONFLICT (some_id1, some_id2, some_id3)
   DO NOTHING
   RETURNING TRUE;
$$;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Định dạng ngày tháng trong PostgreSQL

  2. Cập nhật nhiều hàng trong cùng một truy vấn bằng PostgreSQL

  3. Nhập Java trong JDBC sang Postgres ltree

  4. Trình tự Django và PostgreSQL để tự động gia tăng khóa chính

  5. PG ::UndefinedTable:ERROR:quan hệ không tồn tại với quy ước và đặt tên Rails chính xác