SQL Formatter

Notepad++ plugin

Einstellungen

Jede Einstellung des SQL Formatters, erklärt mit einem echten Vorher/Nachher-Beispiel — kein Rätselraten, was eine Checkbox bewirkt, bevor Sie sie aktivieren.

1. Dialekt

Wählen Sie ANSI, Snowflake, PostgreSQL, MS SQL, MySQL, SQLite oder Databricks. Der Formatter schreibt herstellerspezifische Funktionsnamen in das Äquivalent des Ziel-Dialekts um und wendet sofort eine idiomatische Schreibweise-Voreinstellung an (z. B. Snowflake = alles Großbuchstaben, PostgreSQL = alles Kleinbuchstaben).

Snowflake → MS SQL

NVL und LENGTH existieren nicht in T-SQL — der Formatter kennt die richtige Alternative pro Dialekt (ISNULL, LEN), nicht nur eine feste Übersetzung.

Vorher

SELECT NVL(discount, 0), LENGTH(customer_name)
FROM orders

Nachher

SELECT ISNULL(discount, 0), LEN(customer_name)
FROM orders

MS SQL → Snowflake

Und umgekehrt: IIF, ISNULL und GETDATE() erhalten ihr Snowflake-Äquivalent, inklusive der für diesen Dialekt üblichen Standard-Schreibweise.

Vorher

select iif(amount>1000,'large','small'), isnull(notes,'-'), getdate()
from orders

Nachher

SELECT IFF(AMOUNT > 1000, 'LARGE', 'SMALL'), NVL(NOTES, '-'), CURRENT_TIMESTAMP
FROM ORDERS

2. Schreibweise

Unabhängig einstellbar für Schlüsselwörter, Funktionsnamen und Identifikatoren (Tabellen- und Spaltennamen): Beibehalten, Kleinschreibung oder Großschreibung. So können Sie z. B. Schlüsselwörter in Großbuchstaben haben, ohne dass sich Ihre Spaltennamen mitändern.

Schlüsselwörter groß, Funktionen groß, Identifikatoren klein

Eine häufige Kombination: SQL-Schlüsselwörter und Funktionen heben sich in Großbuchstaben ab, Tabellen- und Spaltennamen bleiben durchgängig klein.

Vorher

select Count(Order_Id), Customer_Name from Orders where Status = 'active'

Nachher

SELECT COUNT(order_id), customer_name
  FROM orders
 WHERE status = 'active'

3. Spalten & Aliase

Setzen Sie jede SELECT-Spalte auf eine eigene Zeile, wählen Sie, ob das Komma vor oder nach dem Spaltennamen steht, und legen Sie fest, was mit AS-Aliasen passiert: hinzufügen, entfernen oder unverändert lassen — mit eigener Schreibweise für das Wort AS selbst.

Komma davor + AS hinzufügen (klein)

Der Standardstil dieses Plugins: jede Spalte auf eigener Zeile, Komma am Anfang (damit Sie es beim Scrollen sofort sehen), und ein impliziter Alias erhält sein AS zurück.

Vorher

SELECT order_id, SUM(amount) total, customer_name FROM orders

Nachher

select order_id
     , sum(amount) as total
     , customer_name
  from orders

Komma danach + AS entfernen

Der klassische Stil: Komma am Zeilenende, und AS wird entfernt, sodass der Aliasname direkt nach dem Ausdruck steht.

Vorher

SELECT order_id, SUM(amount) AS total, customer_name FROM orders

Nachher

select order_id,
       sum(amount) total,
       customer_name
  from orders

4. Ausrichtung

Der charakteristische Look dieses Formatters: SELECT/FROM/WHERE rechtsbündig auf gleicher Breite (der klassische 'Treppen'-Stil), und ON/AND innerhalb eines JOINs unter dem Ende des JOIN-Schlüsselworts ausgerichtet.

Rechtsbündige Schlüsselwörter

select/from/where haben alle den gleichen rechten Rand, sodass die WHERE-Bedingungen direkt unter den Spaltennamen beginnen.

Vorher

SELECT order_id FROM orders WHERE status = 'active'

Nachher

select order_id
  from orders
 where status = 'active'

ON unter JOIN ausgerichtet

Bei mehreren AND-Bedingungen in einem JOIN reihen sie sich schön untereinander auf, statt lose am linken Rand zu kleben.

Vorher

SELECT * FROM orders o JOIN customers c ON c.customer_id = o.customer_id AND c.active = 1

Nachher

select *
  from orders o
  join customers c
    on c.customer_id = o.customer_id
   and c.active = 1

5. Struktur

Wie CASE-Anweisungen, CTEs (WITH-Klauseln), Subqueries und Semikolons aufgebaut werden: jedes WHEN in eigener Zeile oder kompakt, CTEs mit Leerzeile dazwischen, Subqueries, die relativ zu ihrem eigenen Elternelement einrücken, und Semikolons, die automatisch hinzugefügt oder entfernt werden können.

CASE: Expand vs. Inline

'Expand' setzt jedes WHEN in eine eigene Zeile (gut lesbar bei vielen Zweigen); 'Inline' hält alles in einer Zeile (kompakt für kurze CASE-Ausdrücke).

Vorher

SELECT CASE WHEN amount > 1000 THEN 'large' WHEN amount > 100 THEN 'medium' ELSE 'small' END AS size FROM orders

Nachher

select case
           when amount > 1000 then 'large'
           when amount > 100 then 'medium'
           else 'small'
       end as size
  from orders

CTEs: jede in neuer Zeile + eingerückt

Bei mehreren CTEs in einer WITH-Klausel erhält jede CTE einen eigenen Block mit einer Leerzeile dazwischen, und der CTE-Rumpf wird unter dem Namen eingerückt.

Vorher

WITH a AS (SELECT 1), b AS (SELECT 2) SELECT * FROM a, b

Nachher

with a as (
         select 1
     )

   , b as (
         select 2
     )

select *
  from a
     , b

Semikolons automatisch hinzufügen

Praktisch für Skripte mit mehreren Anweisungen: Jede Anweisung ohne Semikolon erhält automatisch eines — in der letzten Zeile, in einer eigenen Zeile oder unverändert.

Vorher

SELECT 1 FROM t
SELECT 2 FROM t

Nachher

select 1
  from t;

select 2
  from t;

6. Abstände

Leerzeichen um Operatoren (a = b vs. a=b) und innerhalb von Funktionsklammern (count( * ) vs. count(*)), eine Leerzeile zwischen Klauseln, wie viele Leerzeilen zwischen Anweisungen erhalten bleiben, eine maximale Zeilenlänge und das automatische Umbrechen langer IN (...)-Listen.

Operatoren: Leerzeichen hinzufügen

a=b, a>b und a<>b erhalten alle Leerzeichen, ohne dass Sie für jeden Operator eine eigene Regel schreiben müssen.

Vorher

SELECT * FROM orders WHERE amount>=100 AND status<>'cancelled'

Nachher

select *
  from orders
 where amount >= 100
   and status <> 'cancelled'

Lange IN (...)-Listen umbrechen

Legen Sie einen Zeichen-Schwellenwert fest; eine längere IN-Liste wird automatisch auf mehrere Zeilen umgebrochen statt einer unlesbaren langen Zeile.

Vorher

SELECT * FROM orders WHERE status IN ('active', 'pending', 'processing', 'shipped', 'delivered')

Nachher

select *
  from orders
 where status in ( 'active', 'pending', 'processing'
                  , 'shipped', 'delivered' )

7. JOINs

Ein Schalter: INNER und OUTER entfernen, sobald sie überflüssig sind. INNER JOIN wird zu JOIN, LEFT OUTER JOIN wird zu LEFT JOIN — kürzer und funktional identisch.

INNER/OUTER entfernen

Vorher

SELECT * FROM orders o INNER JOIN customers c ON c.id = o.customer_id LEFT OUTER JOIN shippers s ON s.id = o.shipper_id

Nachher

select *
  from orders o
  join customers c
    on c.id = o.customer_id
  left join shippers s
    on s.id = o.shipper_id

8. FQDN (vollqualifizierte Namen)

Geben Sie einen Datenbank- und/oder Schemanamen ein, und jeder Tabellenverweis in FROM/JOIN erhält automatisch dieses Präfix — praktisch, wenn Sie mit mehreren Datenbanken/Schemas arbeiten und überall explizit sein möchten.

Datenbank + Schema hinzufügen

Datenbank = 'analytics', Schema = 'public' — jeder unqualifizierten Tabelle wird 'analytics.public.' vorangestellt, Aliase bleiben unberührt.

Vorher

SELECT o.order_id FROM orders o JOIN customers c ON c.id = o.customer_id

Nachher

select o.order_id
  from analytics.public.orders o
  join analytics.public.customers c
    on c.id = o.customer_id

9. Profile

Speichern Sie die komplette Kombination aller obigen Einstellungen unter einem Namen ('Team-Stil', 'Kunde-X', ...) und wechseln Sie mit einem Klick dazwischen. Exportieren Sie als JSON, um es mit Kollegen zu teilen, oder importieren Sie das Profil eines Teamkollegen.

Extra: außerhalb des Einstellungsdialogs

Drei Funktionen, die Sie direkt über das Menü verwenden, ohne vorher etwas einstellen zu müssen.

Convert Quotes

Wechseln Sie zwischen einfachen, doppelten und Backtick-Anführungszeichen für Strings und Identifikatoren — praktisch beim Umstieg von MySQL auf PostgreSQL.

Vorher

SELECT `customer_name` FROM `orders` WHERE `status` = "active"

Nachher

SELECT 'customer_name' FROM 'orders' WHERE 'status' = 'active'

Zahlenformat konvertieren

Konvertieren Sie niederländische Notation (1.234,56) in englische (1,234.56) oder umgekehrt — vermeidet Fehler beim Abtippen von Berichtszahlen.

Vorher

SELECT * FROM orders WHERE amount > 1.234,56

Nachher

SELECT * FROM orders WHERE amount > 1,234.56

dbt / Jinja & No-Format-Pragma

{{ ref(...) }}, {{ var }} und {# comment #} werden erkannt und nie aufgeteilt oder umgeschrieben. Soll ein Block komplett unangetastet bleiben, umschließen Sie ihn mit -- @formatter:off / -- @formatter:on.

Vorher

select {{ ref('orders') }}.order_id
-- @formatter:off
from     weird_legacy_table   x
-- @formatter:on

Nachher

select {{ ref('orders') }}.order_id
-- @formatter:off
from     weird_legacy_table   x
-- @formatter:on