SQLフォーマッター

ログやORMからコピーした1行のSQL文を貼り付けると、フォーマッターがそれをインデントされた句に分け、キーワードの大文字小文字を統一し、SELECTFROMWHEREGROUP BYの前で改行し、射影部分の列を揃えます。MySQL、PostgreSQL、SQL Server、Oracle、SQLite、BigQueryの方言に対応しており、それぞれでキーワードや予約語が少しずつ異なります。

整形の仕組み

  1. 1

    SQLを貼り付け

    1行のかたまり、Hibernateからのミニファイ出力など、なんでも。`;`で区切られた複数文もすべて整形されます。

  2. 2

    方言とスタイルを選ぶ

    方言はキーワード一覧を制御し、スタイルはカンマの位置(先頭か末尾か)、インデント幅、キーワードの大文字・小文字を制御します。

  3. 3

    トークンは正規表現置換ではなく解析される

    トークナイザーが文字列、コメント、括弧、サブクエリを正しく扱います。文字列リテラルはそのまま保持されます。

  4. 4

    整形した出力をコピー

    検証済みのSQL。意味は同じで、レイアウトはすっきりします。

整形前と整形後

整形前:

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;

整形後(先頭カンマ、大文字キーワード、2スペースインデント):

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;

重要なスタイルの選択

  • キーワードの大文字と小文字。 UPPERCASEは伝統的で見つけやすいです。小文字は、構文ハイライトのある最新のコードエディタではすっきり見えます。
  • 先頭カンマと末尾カンマ。 先頭( , col)は1つの列をコメントアウトしやすいです。末尾(col,)はテキストとして自然に読めます。
  • GROUP BYのカンマ位置。 長い句では1行に1つ、短い句ではインラインにすることが多いです。
  • JOINのインデント。 次の行にONを置く(ぶら下げインデント)か、同じ行に置くか。長い条件はぶら下げが向きます。
  • サブクエリ。 開きカッコだけでなく、サブクエリ全体をインデントします。

方言ごとの落とし穴

  • 識別子におけるMySQLのバッククォートとPostgreSQLのダブルクォート。
  • WITH CTE、MS SQLはWITHの前に;が必要です。フォーマッターがこれを処理します。
  • ウィンドウ関数、長いOVER (...)句は、PARTITION BYORDER BYを改行で折り返すと読みやすくなります。
  • BigQueryにはARRAY_AGGSTRUCT、テーブルのサフィックス(*_yyyymmdd)があり、トークナイザーはこれらを壊してはいけません。
  • Oracleには(+)の外部結合構文があります。フォーマッターはこれを保持しつつ、レガシーとして印を付けます。

フォーマッターが行わないこと

  • バグの修正、不正なJOINは不正なままです。
  • SELECT *の展開、列リストはスキーマから推測しません。
  • クエリの最適化、レイアウトのみで、実行計画は扱いません。
  • サブクエリのCTEへの書き換え、別の関心事です。

よくある質問

いいえ。純粋に見た目だけです。空白、改行、カンマの位置は動きますが、キーワード、演算子、リテラル、識別子は完全に保持されます。

対応しています。CREATE TABLEALTERCREATE PROCEDURE、トリガー。フォーマッターはブロック構造(BEGIN ... END)やプロシージャ内の行継続も扱います。

本来は壊れないはずです。壊れたなら、おそらく方言の不一致です。方言を切り替えてみてください。再現する不具合は報告してください。バグとして扱います。

Flink SQLやCassandra CQLは似て見えますが、主流のフォーマッターが壊しがちな方言固有のキーワードがあります。慎重に使い、出力が動くことを確認してください。

関連ツール

このツールは他の言語でも利用できます