JSON zu CSV · SQL
JSON zu CSV in SQL (PostgreSQL)
In PostgreSQL zerlegen Sie ein JSON-Array mit json_to_recordset in echte Tabellenzeilen und exportieren das Ergebnis mit COPY direkt als CSV. So bleibt die Umwandlung komplett in der Datenbank, ganz ohne externes Skript. Das eignet sich, wenn das JSON ohnehin schon in einer Spalte oder Datei liegt.
Ansatz
json_to_recordset projiziert das JSON-Array auf typisierte Spalten, COPY schreibt CSV.
Code-Beispiel
-- JSON-Array in typisierte Spalten zerlegen und als CSV exportieren
COPY (
SELECT *
FROM json_to_recordset('[
{"name": "Müller, A.", "ort": "Köln", "anzahl": 42},
{"name": "Schmidt", "ort": "Bonn", "anzahl": 35}
]') AS t(name text, ort text, anzahl int)
) TO '/tmp/daten.csv'
WITH (FORMAT csv, HEADER true, DELIMITER ';', ENCODING 'UTF8');
-- Aus einer vorhandenen Tabellenspalte mit JSON:
COPY (
SELECT t.*
FROM meine_tabelle m,
json_to_recordset(m.daten_json) AS t(name text, ort text, anzahl int)
) TO '/tmp/daten.csv'
WITH (FORMAT csv, HEADER true);
Hinweise
Der Kern ist json_to_recordset, das ein JSON-Array auf eine Menge von Zeilen abbildet. Anders als in den Programmiersprachen müssen Sie hier die Spalten samt Datentyp in der AS-Klausel benennen, weil SQL ein festes Schema erwartet. Felder, die im JSON fehlen, werden zu NULL, überzählige Schlüssel ignoriert die Funktion. Achten Sie bei den Spaltennamen auf reservierte Wörter: Ein Schlüssel wie alter müsste in Anführungszeichen stehen. Der COPY-Befehl mit FORMAT csv übernimmt das Quoting nach Standard, und HEADER true schreibt die Spaltennamen in die erste Zeile. Wichtig: COPY ... TO mit einem Dateipfad schreibt auf dem Datenbankserver und braucht Superuser-Rechte oder die Rolle pg_write_server_files. Vom Client aus nutzen Sie in psql stattdessen \copy, das mit Ihren lokalen Rechten in eine Datei auf Ihrem Rechner schreibt. Bei jsonb-Spalten nehmen Sie jsonb_to_recordset. Für tief verschachtelte Strukturen kombinieren Sie die Funktion mit jsonb-Operatoren wie ->> in der Projektion, um einzelne Unterfelder als eigene Spalten herauszuziehen.
FAQ
Häufige Fragen
Warum scheitert COPY TO mit einem Berechtigungsfehler?
COPY ... TO 'datei' schreibt auf dem Datenbankserver und braucht entsprechende Rechte. Nutzen Sie in psql stattdessen \copy, das clientseitig mit Ihren lokalen Dateirechten arbeitet.
Was ist der Unterschied zu jsonb_to_recordset?
json_to_recordset arbeitet auf dem Typ json, jsonb_to_recordset auf jsonb. Liegt die Quelle als jsonb-Spalte vor, nutzen Sie die jsonb-Variante.
Sie wollen nicht selbst programmieren? Der JSON-CSV-Konverter wandelt Ihre Daten direkt im Browser um, ohne Upload und ohne Installation.