PostgreSQL SQL Formatter
Füge eine Postgres-Abfrage ein und erhalte sauberes, konsistent eingerücktes SQL. Nummerierte $1-Platzhalter aus Prepared Statements werden erkannt, sodass du sie ausfüllen kannst, und Postgres-spezifische Syntax wie JSONB-Operatoren, Casts und Dollar-quoted Funktionskörper bleibt erhalten.
Eine PostgreSQL-Abfrage, vorher und nachher
Die unformatierte Abfrage unten ist das Beispiel aus dem Editor weiter oben, und die Ausgabe ist genau das, was dieser Formatter mit den Standardoptionen dafür liefert. Nichts davon wurde von Hand nachgebessert.
WITH recent AS (SELECT user_id, count(*) AS n, max(created_at) AS last_seen FROM events WHERE created_at >= $1 AND payload->>'type' = $2 GROUP BY user_id) SELECT u.id, u.email, r.n, row_number() OVER (ORDER BY r.n DESC) AS rank FROM users u JOIN recent r ON r.user_id = u.id WHERE u.status = 'active' AND u.created_at::date BETWEEN $3 AND $4 ORDER BY r.n DESC LIMIT 50 WITH
recent AS (
SELECT
user_id,
count(*) AS n,
max(created_at) AS last_seen
FROM
events
WHERE
created_at >= $1
AND payload ->> 'type' = $2
GROUP BY
user_id
)
SELECT
u.id,
u.email,
r.n,
row_number() OVER (
ORDER BY
r.n DESC
) AS rank
FROM
users u
JOIN recent r ON r.user_id = u.id
WHERE
u.status = 'active'
AND u.created_at::date BETWEEN $3 AND $4
ORDER BY
r.n DESC
LIMIT
50 PostgreSQL-Syntax, die er beherrscht
Ein generischer Formatter verstümmelt dialektspezifische Syntax oder lehnt sie gleich ab. Das sind die PostgreSQL-Konstrukte, gegen die dieser Formatter getestet wird.
$1, $2 Nummerierte Platzhalter aus Prepared Statements werden erkannt und können ausgefüllt werden, um eine ausführbare Abfrage zu erzeugen.
payload->>'key' JSON- und JSONB-Operatoren bleiben genau so, wie sie geschrieben wurden.
value::type Cast-Syntax wird nie mit einem :name-Parameter verwechselt.
$$ ... $$ Dollar-quoted Funktionskörper werden als Literale behandelt, sodass Schlüsselwörter darin nicht neu formatiert werden.
WITH ... AS Die WHERE-Klausel jedes CTE wird separat gelistet und kann eigenständig bearbeitet werden.
OVER (PARTITION BY ...) Fensterfunktionen und ihre Frames werden formatiert, ohne die Klausel auseinanderzureißen.
FAQ zum PostgreSQL-Formatter
Verarbeitet es $1-Platzhalter aus Prepared Statements?
Ja. Postgres' nummerierte Platzhalter werden erkannt und im Parameter-Panel gelistet. Fülle jeden aus und schalte die Ausgabe auf ausgefülltes SQL, um eine Abfrage zu erhalten, die du direkt in psql einfügen kannst.
Zerstört es meine ::Casts oder JSONB-Operatoren?
Nein. Casts werden von :name-Parametern unterschieden, und JSON/JSONB-Operatoren wie -> und ->> gehen unverändert durch.
Kann er eine Abfrage mit mehreren CTEs formatieren — und nur eine davon bearbeiten?
Ja. Jede WHERE-Klausel wird nach der CTE aufgeführt, zu der sie gehört, sodass eine Abfrage aus einer Kette von WITH-Blöcken einen Eintrag pro Block ergibt. Sie wählen einen aus, bearbeiten ihn als UND/ODER-Baum oder als Knotengraph, und die Änderung landet exakt in dieser Klausel, während der Rest der Abfrage Byte für Byte unangetastet bleibt.
Formatiert er auch eine unvollständige Abfrage oder eine einzelne WHERE-Klausel?
Ja. Nichts hier hängt von einer vollständigen, gültigen Analyse ab. Sie können also ein Fragment aus einer Logzeile oder einem ORM-Debug-Ausgabe einfügen — auch nur ein WHERE created_at >= $1 AND status = $2 — und es wird trotzdem formatiert und visuell bearbeitbar.
Bleiben PL/pgSQL-Rümpfe in Dollar-Quotes unverändert?
Ja. Ein dollar-quotierter Rumpf gilt als ein einziges Literal, sodass die Schlüsselwörter darin nicht so eingerückt werden, als gehörten sie zur äusseren Anweisung, und ein öffnendes Tag wird nur mit seinem eigenen schliessenden Tag gepaart, nicht mit dem nächstbesten Dollarzeichen.
Kann er eine Postgres-Abfrage wieder auf eine Zeile minifizieren?
Ja — Verschönern und Minifizieren stehen beide zur Verfügung. Das Minifizieren berücksichtigt echte Leerzeichen, statt einen pauschalen regulären Ausdruck anzuwenden. Abstände innerhalb von String-Literalen bleiben erhalten, und die minifizierte Abfrage liefert exakt dieselben Zeilen wie zuvor.