Vai al contenuto
SQL

SQL formatter multi-dialect

Formatta query SQL in 13 dialetti diversi: MySQL, MariaDB, PostgreSQL, SQLite, MS SQL Server (T-SQL), BigQuery, Snowflake, Redshift, Spark SQL, Trino/Presto, DB2, Oracle PL/SQL e standard SQL. Indentazione configurabile, keyword case (UPPERCASE classico, lowercase moderno o preserve), modalità minify per inserire la query in stringa di codice o in un log su singola riga.

Come usare il formatter

  1. 1

    Scegli il dialetto

    Default MySQL. Per altri DB usare il dialetto specifico: PostgreSQL gestisce ARRAY, JSON, RETURNING; MS SQL T-SQL gestisce TOP, OUTPUT, CROSS APPLY; BigQuery gestisce MERGE, EXCEPT clause specifiche. Il formatter rispetta la grammatica del dialetto scelto.

  2. 2

    Configura case keywords

    lowercase: SELECT, FROM, WHERE -> select, from, where (default convention moderna). UPPERCASE: stile classico anni 90, ancora preferito da molti DBA. preserve: mantiene il case originale.

  3. 3

    Indentazione

    2 spaces (default JS/Node convention), 4 spaces (Python/Java/SQL classico), Tab (vim/.editorconfig). Output sempre normalizzato a una scelta consistente.

  4. 4

    Minify

    Per query da inserire in stringa di codice o log: minify rimuove commenti (-- e /* */), collapsa whitespace a singolo spazio, trim. Output in single line.

Multi-dialect serio e privacy operativa

Grammatiche dedicate per dialetto. Molti formatter online si limitano a un parser ANSI SQL standard che non riflette la realtà operativa: le stored procedure PL/SQL hanno BEGIN/EXCEPTION/END che lo standard non conosce, BigQuery usa STRUCT, ARRAY_AGG, EXCEPT con parsing rule custom, T-SQL aggiunge TOP, OUTPUT, CROSS APPLY e i delimiter MySQL stored proc cambiano la grammatica del batch. Il formatter qui usa una grammatica dedicata per ciascuno dei 13 dialetti supportati, inclusi i riservati specifici e i construct non-standard.

Privacy operativa. Le query SQL sono spesso confidenziali: contengono nomi di tabelle interne, schema di business, talvolta valori reali in clausole WHERE (email di clienti, identificatori interni). Caricarle su un sito web per ottenerne il pretty-print è un anti-pattern documentato per chi gestisce database di produzione. Qui la formattazione avviene direttamente nel browser: la query non transita per backend di terze parti.

Riconoscimento dei placeholder. Le query parametrizzate vengono trattate come token opachi e mantenute così come sono nell'output: funziona per ? (MySQL, SQLite), $1 (PostgreSQL), :name (Oracle, MySQL bind), @name (T-SQL). Utile per copiare la query da un log applicativo, formattarla per leggibilità e rieseguirla senza dover sostituire i parametri prima.

Glossario

Termini tecnici usati in questa pagina, spiegati in due righe.

Dialetto SQL #
Variante di SQL specifica di un DBMS. Standard ANSI SQL è la base, ma ogni vendor ha estensioni proprie (T-SQL Microsoft, PL/SQL Oracle, PL/pgSQL Postgres, ecc.). Il formatter qui copre 13 dialetti.
Keyword case #
Convenzione di capitalizzazione delle parole riservate SQL: UPPERCASE classico (SELECT, WHERE), lowercase moderno (select, where), preserve (mantieni input).
T-SQL #
Transact-SQL, dialetto SQL di Microsoft SQL Server e Sybase. Estensioni: TOP n, OUTPUT clause, CROSS APPLY, variabili @nome, batch GO, BEGIN TRY/CATCH.
PL/SQL #
Procedural Language SQL di Oracle. Aggiunge a SQL: BEGIN/EXCEPTION/END, cursor esplicito, RECORD type, packages, triggers, trasloccazioni atomiche estese.

Domande frequenti

Il formatter è compatibile con il mio dialetto specifico (es. CockroachDB, ClickHouse)?
I 13 dialetti coperti sono i più comuni. CockroachDB è compatibile sintatticamente con PostgreSQL, quindi usa quel dialetto. ClickHouse ha sintassi sua specifica (FORMAT, MATERIALIZED VIEW custom): per ora usa standard SQL e correggi a mano se serve. Se serve un dialetto specifico, sql-formatter è open source e nuovi dialetti vengono aggiunti regolarmente.
Stored procedure complete con CREATE PROCEDURE, BEGIN, EXCEPTION sono supportate?
Si per i dialetti che le hanno (T-SQL, PL/SQL, MySQL stored proc). Il formatter riconosce BEGIN/END nesting, IF/ELSE, EXCEPTION/WHEN handlers. Per script multi-statement con DELIMITER (MySQL custom delimiter), il delimitatore alternativo viene riconosciuto.
Posso formattare migliaia di query in batch?
Una alla volta dall'interfaccia. Per workflow batch i tool della stessa famiglia esistono come pacchetto npm (sql-formatter) e come CLI (npx sql-formatter): in 5 righe di Node.js leggi un file di query e le riformatti in loop, integrabile in pre-commit hook o pipeline CI.
Mantiene i commenti (-- e /* */)?
Si, in modalità format. Sia inline (--...) che block (/*... */) vengono preservati e re-indented insieme al codice. In modalità minify vengono rimossi (e' lo scopo). Per preservarli in minify, il formatter open source ha opzione denseOperators ma non è esposta nell'UI corrente.
Funziona offline?
Sì. Tutto il parser e il rendering sono caricati col primo load della pagina; in seguito il formatter funziona anche senza connessione, ad esempio in scenari di lavoro su rete intermittente o air-gapped.
Le query parametrizzate (?, $1, :name) come vengono trattate?
Come token opachi: il formatter le riconosce come placeholder e le mantiene così come sono nell'output formattato. Funziona per ? (mysql/sqlite), $1 (postgres), :name (oracle/mysql), @name (T-SQL).
Posso usare il tool per validare la sintassi SQL?
Indirettamente: se il formatter throws errore di parsing, la query è sintatticamente invalida nel dialetto scelto. Pero' il formatter non è un linter: errori semantici (riferimenti a colonne inesistenti, type mismatch) richiedono il DB reale che li valida via EXPLAIN o EXECUTE.

Chi sviluppa questi strumenti?

Maurizio Fonte, consulente IT senior con oltre 20 anni di esperienza in PHP, Laravel, infrastrutture Linux, cybersecurity e integrazione AI/LLM in azienda. Backend di produzione, modernizzazione di codice legacy, audit di sicurezza, agenti AI e MCP server custom: il lavoro che sta dietro a questi strumenti.

Conosci Maurizio Fonte