Formater SQL

Wklej jednolinijkową instrukcję SQL skopiowaną z loga albo ORM-a, a formater rozbije ją na wcięte klauzule ze spójną wielkością liter słów kluczowych, nowymi liniami przed SELECT, FROM, WHERE, GROUP BY oraz wyrównanymi kolumnami w projekcji. Obsługuje dialekty MySQL, PostgreSQL, SQL Server, Oracle, SQLite i BigQuery, każdy ma nieco inne słowa kluczowe i słowa zarezerwowane.

Jak działa formatowanie

  1. 1

    Wklej swój SQL

    Jednolinijkowy blok, zminifikowane wyjście z Hibernate, cokolwiek. Wiele instrukcji oddzielonych `;` jest formatowanych w całości.

  2. 2

    Wybierz dialekt i styl

    Dialekt steruje listą słów kluczowych; styl steruje rozmieszczeniem przecinków (na początku lub na końcu), szerokością wcięcia i wielkością liter słów kluczowych.

  3. 3

    Tokeny są parsowane, a nie zamieniane regexem

    Tokenizer poprawnie obsługuje ciągi, komentarze, nawiasy i podzapytania. Literały tekstowe są zachowane dosłownie.

  4. 4

    Skopiuj sformatowane wyjście

    Zwalidowany SQL: ta sama semantyka, czystszy układ.

Przed i po

Przed:

SELECT u.id,u.name,COUNT(o.id) AS orders FROM users u LEFT JOIN orders o ON o.user_id=u.id WHERE u.created_at>='2024-01-01' GROUP BY u.id,u.name HAVING COUNT(o.id)>5 ORDER BY orders DESC LIMIT 50;

Po (przecinek na początku, słowa kluczowe wielkimi literami, wcięcie 2 spacje):

SELECT
    u.id
  , u.name
  , COUNT(o.id) AS orders
FROM users u
LEFT JOIN orders o
  ON o.user_id = u.id
WHERE u.created_at >= '2024-01-01'
GROUP BY u.id, u.name
HAVING COUNT(o.id) > 5
ORDER BY orders DESC
LIMIT 50;

Wybory stylu, które mają znaczenie

  • Wielkie vs małe litery słów kluczowych. WIELKIE litery są tradycyjne i łatwe do skanowania. Małe litery wyglądają czyściej w nowoczesnych edytorach z podświetlaniem składni.
  • Przecinki na początku vs na końcu. Na początku ( , col) ułatwia zakomentowanie pojedynczej kolumny. Na końcu (col,) czyta się naturalniej w tekście.
  • Rozmieszczenie przecinków w GROUP BY. Często po jednym na linię dla długich klauzul, w jednej linii dla krótkich.
  • Wcięcie JOIN. ON w kolejnej linii (wcięcie wiszące) vs w tej samej linii. Długie warunki zyskują na wcięciu wiszącym.
  • Podzapytania. Wcinaj całe podzapytanie, nie tylko otwierający nawias.

Pułapki specyficzne dla dialektu

  • Apostrofy odwrotne MySQL vs podwójne cudzysłowy PostgreSQL dla identyfikatorów.
  • CTE z WITH, MS SQL wymaga ; przed WITH; formater to obsługuje.
  • Funkcje okienkowe, długie klauzule OVER (...) zyskują na zawijanych w linie PARTITION BY i ORDER BY.
  • BigQuery ma ARRAY_AGG, STRUCT i przyrostki tabel (*_yyyymmdd), których tokenizer nie może rozbić.
  • Oracle ma składnię złączeń zewnętrznych (+), formater ją zachowuje, ale oznacza jako przestarzałą.

Czego formater nie robi

  • Naprawianie błędów, niepoprawny JOIN pozostaje niepoprawny.
  • Rozwijanie SELECT *, listy kolumn nie są wnioskowane ze schematu.
  • Optymalizacja zapytań, tylko układ, nie plany wykonania.
  • Przepisywanie podzapytań na CTE, to inna sprawa.

Najczęściej zadawane pytania

Nie, jest czysto kosmetyczny. Spacje, nowe linie i rozmieszczenie przecinków się przesuwają, ale słowa kluczowe, operatory, literały i identyfikatory są zachowane dokładnie.

Obsługiwane, CREATE TABLE, ALTER, CREATE PROCEDURE, wyzwalacze. Formater radzi sobie z konstrukcjami blokowymi (BEGIN ... END) i kontynuacjami linii wewnątrz procedur.

Nie powinno, jeśli tak się dzieje, to najpewniej niezgodność dialektu. Spróbuj przełączyć dialekt. Zgłaszaj uporczywe awarie; traktujemy je jako błędy.

Flink SQL i Cassandra CQL wyglądają podobnie, ale mają słowa kluczowe specyficzne dla dialektu, które popularne formatery przekręcają. Używaj z ostrożnością i sprawdź, czy wynik się uruchamia.

Powiązane narzędzia

Narzędzie jest dostępne w innych językach