PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Masukkan terus semua kombinasi unik yang ditemui dari tiga ID

Seperti yang sudah dinyatakan oleh @a_horse_with_no_name:Fungsi unnest() meratakan tidak hanya dimensi pertama tetapi semua elemen bersarang. Jadi itu menciptakan satu baris per bilangan bulat. Itu, tentu saja menghasilkan satu kolom dengan (dalam kasus Anda) enam nilai. Inilah yang dimaksud dengan pesan pengecualian:Anda menghasilkan satu kolom tetapi diharapkan tiga.

Jadi, Anda memerlukan solusi untuk menghilangkan sarang hanya pada dimensi pertama. Saya menggunakan solusi yang disajikan di sini :

demo:db<>biola

Membuat fungsi 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;

Yang ini hanya membongkar dimensi pertama. Jadi Anda dapat menggunakannya sebagai ganti unnest() Anda mencoba dalam fungsi Anda:

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. Bagaimana cara menggunakan SQL for loop untuk memasukkan baris ke dalam database?

  2. Bagaimana cara menambahkan nilai parameter ke kueri sql pgadmin?

  3. Membuat UUID di Postgres untuk pernyataan Sisipkan?

  4. pgAdmin III :Tidak ada server yang muncul

  5. Ubah satu baris menjadi beberapa baris dengan lebih sedikit kolom