Ich erstelle eine Prozedur zum Parsen von Eingabe JSON-Daten und in Tabellen gespeichert. Die Funktion sieht so aus:Postgresql Einfügen auswählen mit mehreren Zeilen
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
)
die Dateneingabe Name als Text, Autos hat und Marken sind Array, die alle in einem json gewickelt. So hat der letzte Einsatz gemischte Werttypen, wenn die Person zwei Autos hat, habe ich 4 Reihen in t3 eingefügt, weil c.id und json_array_elements_text (d :: json -> 'Marken') beide zwei Datensätze haben, 2x2 = 4 , wie kann ich den eingefügten Wert eins zu eins zuordnen? Daher sollte der 1. c.id der ersten Marke zugeordnet werden.
Können Sie ein Beispiel Ihrer json, tatsächliches Ergebnis und erwartetes Ergebnis hinzufügen? und möglicherweise Beschreibung Ihrer Tabellen. – cachique
Sicher, t1 speichert ID und Name: Text, t2 hat ID und Autos: Text (jedes Auto hat seine eigene Zeile), T3 im Grunde verknüpfen t1 und t2 hinzufügen Markeninfo, t3: id: int, name_id (fk zu t1), cars_id (fk bis t2) und Marke: Text. Der JSON sieht aus wie {Name: John, Autos: ["BMW X5 XDrive", "Volvo V90 Rdesign"]}, Marken: ["BMW", "Volvo"]}. Erwarte t3 maps eine car_id zu einem einzigen Marken gleichen Index wie in json Array. diese Funktion fügt 4 Reihen in t3 ein, jedes Auto erscheint zweimal mit verschiedenen Marken – Wizer