SQL フォーマッター | 詰め込んだクエリを句単位で整形
ORM のログや 1 行に詰め込まれた SQL を、SELECT・FROM・WHERE・JOIN といった句ごとに改行し、4 スペースのインデントで階層化する整形ツールです。予約語は大文字に揃え、100 種以上のキーワード・文字列・数値・コメントを色分けして表示します。
💡 このツールについて
レビュー依頼で送られてきた SQL が 1 行にべったり繋がっていて、どこが結合条件でどこが絞り込みなのか追えない。そんな場面で句の境界を機械的に切り出して読める形に直すのがこのツールの役割です。
整形は字句解析で進めます。文字列リテラル('...' や "...")やコメント(-- 行末コメント、/* */ ブロックコメント)の中身は変更せず、外側のキーワードだけを大文字化します。GROUP BY や ORDER BY、LEFT OUTER JOIN のような複合句はひとまとまりとして扱い、独立した行に配置します。サブクエリは括弧の中で SELECT が始まるとインデントを 1 段深め、閉じ括弧で戻すため、ネストの深さがそのまま字下げで見えます。CASE 式は WHEN / THEN / ELSE を字下げし、END で揃えます。
入力欄と整形結果欄が左右に並ぶので、元のクエリと結果を見比べながら作業できます。結果はそのままコピーして SQL クライアントや Pull Request のコメントに貼り付けられます。
🧐 よくある質問
Q. どの SQL 方言に対応していますか?
A. 標準 SQL に加え、MySQL のバッククォート識別子、PostgreSQL の RETURNING / ON CONFLICT、ウィンドウ関数の OVER / PARTITION BY など主要方言で共通する予約語を 100 種以上収録しています。方言固有の独自関数は識別子として扱われますが、レイアウト整形には影響しません。
Q. 文字列の中の SELECT も大文字化されますか? A. されません。シングルクォート・ダブルクォートで囲まれた文字列リテラルとコメントは、字句解析の段階で別トークンとして切り出し、内容を一切変更しません。
Q. 複数の SQL 文をまとめて整形できますか?
A. できます。セミコロン(;)で区切られた文は、文ごとに空行を挟んで整形されます。
Q. インデント幅は変えられますか? A. 現在は 4 スペース固定です。コピー後にエディタの一括置換で調整してください。
Q. 整形結果が崩れることはありますか?
A. 動的に組み立てる文字列連結や、テンプレートエンジンのプレースホルダ({{ }} など)が混ざった SQL は、字句解析が想定する文法から外れるため、意図しない改行が入る場合があります。
📚 豆知識
SQL のキーワードを大文字で書く習慣は、初期の SQL が大文字小文字を区別しない言語として設計され、予約語を識別子と視覚的に分けるための慣例として定着したものです。ANSI 標準上は小文字でも動作しますが、多くのコーディング規約が今も大文字を推奨しています。一方で、識別子(テーブル名・カラム名)の大文字小文字の扱いは DBMS ごとに異なり、PostgreSQL はダブルクォートで囲まないと小文字に畳まれます。整形ツールが識別子の元の表記を保ったまま予約語だけを大文字化するのは、この差異を壊さないためです。