bitlvl
DE

SQL-Formatter

Fügen Sie eine Abfrage, eine Migration oder einen ganzen Dump von Anweisungen ein. Keywords werden umgeschrieben, Klauseln kommen auf eigene Zeilen, Unterabfragen, CTEs, CASE-Ausdrücke und JOIN-Bedingungen werden eingerückt, und Strings, Bezeichner und Kommentare bleiben genau, wie sie waren. Funktioniert für PostgreSQL-, MySQL/MariaDB-, SQLite- und SQL-Server-Syntax.

Die Ergebnisse und Meldungen dieses Tools werden auf Englisch angezeigt.

Was der Formatter tut

  • Klauseln (SELECT, FROM, WHERE, GROUP BY, ORDER BY, SET, VALUES, RETURNING…) beginnen jeweils eine Zeile; ihr Inhalt wird darunter eingerückt, bei Listen ein Element pro Zeile.
  • Joins beginnen eine Zeile auf Klauselebene; die ON-Bedingung bleibt beim Join, und weitere AND/OR-Terme rücken darunter ein.
  • Unterabfragen und CTEs öffnen einen geklammerten Block, dessen Inhalt eine Ebene eingerückt wird; kurze geklammerte Listen (IN ('a', 'b'), Funktionsargumente, Tupel) bleiben auf einer Zeile.
  • CASE-Ausdrücke setzen jedes WHEN und das ELSE auf eine eigene Zeile und richten END an CASE aus.
  • Fensterfunktionen halten OVER (PARTITION BY … ORDER BY …) auf einer Zeile, wenn es passt.
  • CREATE TABLE schreibt eine Spaltendefinition pro Zeile; INSERT … VALUES schreibt ein Tupel pro Zeile.
  • Anweisungen werden nach jedem Semikolon durch eine Leerzeile getrennt.

Was es nie anfasst

String-Literale ('it''s', E'\n', $$ … $$), Bezeichner in Anführungszeichen ("Name", `name`, [name]), Kommentare (--, #, /* */) und Parameter (?, $1, :name, @var) werden Byte für Byte kopiert. Nur Leerraum und die Schreibung von Keywords ändern sich, also ist die formatierte Abfrage dieselbe Abfrage. Die Umschreibung gilt für SQL-Keywords und Standardfunktionen (COUNT, COALESCE, NOW…), nicht für Ihre eigenen Bezeichner: my_table bleibt my_table, auch im Großschreibmodus.

Kommas hinten oder vorn

Kommas hinten (a, am Zeilenende) erzeugen die meisten Styleguides und ORMs. Kommas vorn (, b am Zeilenanfang) erlauben es, jede Zeile einer Select-Liste außer der ersten auszukommentieren, ohne die Abfrage zu brechen, weshalb sie in Analytics-SQL beliebt sind. Nehmen Sie, was Ihr Team schneller liest; der Formatter konvertiert zwischen beiden.

Minifizieren

Minifizieren fasst alles auf eine Zeile mit einfachen Leerzeichen zusammen und verwandelt Zeilenkommentare in Blockkommentare, damit sie überleben. Nützlich für Log-Zeilen, URL-Parameter oder das Einfügen einer Abfrage in einen Chat, ohne dass die Zeilenumbrüche verschluckt werden.

Dialekte

Der Tokenizer versteht PostgreSQL (::-Casts, $1-Parameter, Dollar-Quoting, ->>-JSON-Operatoren, FILTER, RETURNING, ON CONFLICT), MySQL/MariaDB (Backtick-Bezeichner, #-Kommentare, STRAIGHT_JOIN, ON DUPLICATE KEY UPDATE, LIMIT x OFFSET y), SQLite und SQL Server ([eckige] Bezeichner, @variablen, TOP, CROSS APPLY). Er validiert das SQL nicht; eine Abfrage mit Syntaxfehler wird nach bestem Bemühen formatiert, damit Sie sie trotzdem lesen können.

SQL anderswo formatieren

# PostgreSQL: pg_format (pgFormatter, Perl)
pg_format -s 2 -u 1 query.sql

# jeder Dialekt: sqlfluff (Python), lintet auch
sqlfluff fix --dialect postgres query.sql

# JavaScript: sql-formatter
npx sql-formatter -l postgresql query.sql

Fragen

Ändert es, was die Abfrage tut?

Nein. Nur Leerraum und Keyword-Schreibung ändern sich; Literale, Bezeichner, Kommentare und Parameter werden unverändert kopiert. Die Umschreibung gilt für Keywords und Standard-Funktionsnamen, die in jedem SQL-Dialekt schreibungsunabhängig sind.

Warum steht eine Unterabfrage auf mehreren Zeilen, obwohl sie kurz ist?

Jede geklammerte Gruppe, die ein Klausel-Keyword enthält (SELECT, FROM, WHERE…), wird als Block geschrieben, weil das verschachtelte Abfragen lesbar macht. Funktionsargumente, IN-Listen und VALUES-Tupel bleiben inline, wenn sie kurz sind.

Kann es PL/pgSQL-Funktionen oder Stored Procedures formatieren?

Der Rumpf einer Funktion in $$ … $$ ist für den Formatter ein String-Literal und bleibt, wie er ist. Die CREATE-FUNCTION-Anweisung drumherum wird formatiert. Vollständige Formatierung prozeduraler Sprachen ist nicht vorgesehen.

Wird mein SQL an einen Server gesendet?

Nein. Die Seite läuft vollständig in Ihrem Browser, was der Punkt ist bei Abfragen mit Produktions-Tabellennamen oder -Literalen.

Was ist mit EXPLAIN-Ausgaben?

Das ist ein anderes Tool: Fügen Sie den Plan in den EXPLAIN-Visualizer ein, der den Baum zeichnet und die Fehlschätzungen markiert.