SQL整形・圧縮

SELECT・INSERT・UPDATE・DELETE・CREATE TABLE・WITH(CTE)・JOIN・サブクエリ・CASE を読みやすく整形、または1行に圧縮します。キーワードの大小、インデント幅、カンマの位置を選べます。文字列とコメントの中身は変えません。

読み込み中…

使い方と仕様

貼り付けたSQLを、SELECT・FROM・WHERE・GROUP BY・ORDER BY などの句ごとに改行し、列の並びは1行に1件ずつ並べます。JOIN は FROM と同じ位置、ON は一段下げ、WHERE や ON の AND・OR は行を分けます(BETWEEN a AND b の AND では分けません)。サブクエリと WITH の中身は一段下げ、CASE は WHEN・ELSE ごとに改行します。CREATE TABLE は列定義を1行に1件ずつ、INSERT の VALUES は組ごとに1行です。

変えるのは空白・改行と、キーワードの大文字・小文字だけです。SQLの意味は解釈せず、文を書き換えません。文字列('it''s' のような '' のエスケープ込み)、引用された識別子("…"・`…`・[…])、コメント(-- と /* */。/* の入れ子も1つのコメントとして扱います)、PostgreSQLの $$ … $$ で囲まれたブロック、数値、記号は、中身を1文字も変えずにそのまま出力します。整形のたびに、元のSQLと「空白・コメント以外のトークンの並び」が一致するかを確かめ、食い違ったら結果を出さずにエラーにします。

大文字・小文字の変換が及ぶのは、SELECT や JOIN のようなキーワードと、直後に ( が続く COUNT・SUM・COALESCE などの関数名だけです。t.order のようにドットの前後にある語は列名・表名として扱い、変換しません。name・date・text・status・value・key のように列名でよく使われる語も、変換の対象から外しています(PRIMARY KEY の KEY だけは変換します)。そのため、DATE や TEXT などの型名は小文字のまま残ることがあります。

圧縮は、空白と改行を詰めて1行にします。詰めると別のトークンに読まれてしまう箇所(- と -1、/ と * など)だけ空白を残します。行コメント(--)は、後ろの語を飲み込まないよう改行が必要なので、その行だけは改行が残ります。コメントを除くオプションを入れると、完全に1行になります。

対応していないものもあります。MySQL の \ によるエスケープ('it\'s')は文字列の終わりを誤るため扱わず、'' だけを認めます(PostgreSQL の E'…' は \ を扱います)。MySQL の # コメント、DELIMITER を使うストアドプロシージャ、MERGE 文、PL/pgSQL や T-SQL の制御構文(IF・WHILE・BEGIN…END)は専用の整形をしません(トークンは保たれますが、改行位置は単純になります)。[ ] は SQL Server の識別子として扱い、PostgreSQL の配列の添字 arr[1] も同じ塊として中身を保ちます。文法の誤りは検出しません。

よくある質問

整形すると、SQLの動作が変わることはありませんか?
空白・改行・キーワードの大小しか変えないので、通常は変わりません。ただし、閉じていない文字列や、方言の記法を誤って読んだ場合はこの限りではないので、実行前に結果を見てください。閉じていない文字列・コメントは、画面に警告を出します。
列名や別名が大文字に変わってしまうことはありますか?
SELECT・FROM などのキーワードと、かっこが続く関数名だけを変換します。ふつうの列名・表名・別名はそのままです。ただし SQL のキーワードそのものと同じ綴りの列名(order など)を引用符なしで使っている場合は、キーワードと見分けられないため変換されます。そうした名前は "…" や `…` で囲むのが確実です。
カンマを行頭に置くのは、どういうときに使いますか?
列を1行に1件ずつ並べたとき、最後の列を消してもカンマの付け外しが不要になり、差分も見やすくなります。好みの問題で、動作に違いはありません。

関連ツール