JSON zu CSV · SQL
JSON zu CSV in SQL (PostgreSQL)
In PostgreSQL zerlegst du ein JSON-Array mit json_to_recordset in echte Tabellenzeilen und exportierst 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", "alter": 42},
{"name": "Schmidt", "ort": "Bonn", "alter": 35}
]') AS t(name text, ort text, alter int)
) TO '/tmp/daten.csv'
WITH (FORMAT csv, HEADER true, 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, alter 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 musst du hier die Spalten samt Datentyp in der AS-Klausel explizit benennen, weil SQL ein festes Schema erwartet. Felder, die im JSON fehlen, werden zu NULL, überzählige Schlüssel ignoriert die Funktion. 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 erfordert Superuser-Rechte, vom Client aus nutzt du in psql stattdessen \copy, das mit deinen lokalen Rechten in eine Datei auf deinem Rechner schreibt. Bei jsonb-Spalten nimmst du jsonb_to_recordset. Für tief verschachtelte Strukturen kombinierst du 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. Nutze in psql stattdessen \copy, das clientseitig mit deinen 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, nutzt du die jsonb-Variante, die zudem schnelleren Zugriff auf einzelne Felder erlaubt.
Du willst nicht selbst programmieren? Der JSON-zu-CSV-Converter wandelt deine Daten direkt im Browser um, ohne Upload und ohne Installation.