PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Непрекъснато вмъквайте всички срещани уникални комбинации от три идентификатора

Както @a_horse_with_no_name вече каза:Функцията unnest() изравнява не само първото измерение, но и всички вложени елементи. Така че създава един ред на цяло число. Това, разбира се, води до една колона с (във вашия случай) шест стойности. Ето какво означава съобщението за изключение:Генерирате една колона, но се очакват три.

И така, имате нужда от решение за разместване само на първото измерение. Използвам решенията, представени тук :

demo:db<>fiddle

Създаване на функцията на 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;

Това разгражда само първото измерение. Така че можете да го използвате вместо опита си unnest() във вашата функция:

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. ST_DWithin понякога не използва индекс

  2. Функцията min(uuid) не съществува в postgresql

  3. pg_dump срещу pg_dumpall? кой да използвам за архивиране на база данни?

  4. Как да получа общия брой таблици в postgresql?

  5. Как да конвертирате полето за клеймо за време в низ ISO 8601 в дадена часова зона?