Je crée une procédure pour analyser les données d'entrée json et les stocker dans des tables. La fonction ressemble:Postgresql Insert select avec plusieurs lignes
create or replace function test_func(d json)
returns void as $$
begin
with n as (
insert into t1 (name) values (d::json -> 'name') returning id
), c as (
insert into t2 (cars) values json_array_elements_text(d::json -> 'cars') returning id
)
insert into t3 (id, name_id, cars_id, brand)
select 1, n.id, c.id, json_array_elements_text(d::json -> 'brands') from n, c;
end;
$$ language plpgsql;
CREATE TABLE t1
(
"id" SERIAL PRIMARY KEY,
"name" text NOT NULL
)
CREATE TABLE t2
(
"id" SERIAL PRIMARY KEY,
"cars" text NOT NULL,
"car_type" int
)
CREATE TABLE t3
(
"id" int,
"name_id" int REFERENCES t1(id),
"cars_id" int REFERENCES t2(id),
"brand" text
)
l'entrée de données est le nom que le texte, les voitures et les marques sont tableau, le tout enveloppé dans un JSON. Donc la dernière insertion a des types de valeurs mélangés, si la personne a deux voitures, j'ai 4 lignes insérées dans t3 parce que c.id et json_array_elements_text (d :: json -> 'brands') ont deux ensembles de données, 2x2 = 4 , comment puis-je mapper la valeur insérée à un sur un? donc 1er c.id devrait être mappé à la 1ère marque.
Pouvez-vous ajouter un exemple de votre JSON, résultat réel et le résultat attendu? et éventuellement la description de vos tables. – cachique
Bien sûr, t1 stocke id et nom: texte, t2 a id et voitures: texte (chaque voiture a sa propre ligne), t3 essentiellement lien t1 et t2 ajoutant des informations de marque, t3: id: int, name_id (fk à t1), cars_id (fk à t2) et marque: texte. Le json ressemble à {nom: john, voitures: ["bmw X5 xdrive", "volvo v90 rdesign"]}, marques: ["bmw", "volvo"]}. Attendez-vous à ce que t3 associe un car_id au même index de marque unique que dans le tableau json. cette fonction insère 4 rangées dans t3, chaque voiture apparaît deux fois avec des marques différentes – Wizer