SQL整形・圧縮

SELECT・FROM・WHERE といったキーワードで改行を入れ、括弧の深さに合わせて字下げします。文の意味は一切解釈せず、見た目だけを整えるので、MySQLもPostgreSQLもOracleも動き、知らない構文が壊されることもありません。

インデント

貼り付けたコードは端末から出ません。 ブラウザの中だけで処理し、どこにも送らず保存もしません。社内の設定ファイルや本番のクエリのように外へ出しにくいものも、そのために使えます。

どこで改行するか

SELECT・FROM・WHERE・GROUP BY・HAVING・ORDER BY・LIMIT、JOIN の仲間、ON・AND・OR、INSERT INTO・VALUES・UPDATE・SET・DELETE FROM、UNION、WITH、CREATE・ALTER・DROP TABLE の前で改行します。AND と OR も自分の行を持つので、条件が複数あれば一行に一つずつ並び、長い WHERE を読んでいて条件を見落とすことが減ります。字下げは括弧の深さに従います。サブクエリは一段内側に入り、閉じ括弧が行頭に来ればその行から外に戻ります。

大文字化は行を開くキーワードだけに及びます

初期状態でオンになっている大文字化は、上のキーワードだけを変えます。AS・DISTINCT・COUNT や列名は打った通りに残るので、結果が半分だけ大文字に見えるのは正常です。意味を読まない代償もここにあります。set・limit のようにキーワードと同じ名前の列を引用符無しで書くと、その場所で改行されます。そうした名前は二重引用符かバッククォートで囲んでおけば、文字列として扱われて素通りします。

圧縮が取り除くもの

連続する空白と改行を一つの空白にまとめ、括弧・カンマ・セミコロンの周りの空白を取り、/* */ コメントを消します。-- コメントも消しますが、改行を一つ残します。行末までがコメントなので、丸ごと消すと次の行が前の行にくっついて別の文になってしまうからです。引用符の中は '' で書いた引用符まで含めてそのままです。ログに一行で残すときや、URL の値として渡すときに使います。

キーワードが別の意味で使われている場所

意味を読まない代償は、同じ語が別の意味で使われている場所に現れます。BETWEEN 1 AND 10 の AND は条件を繋ぐものではないのに、その前で改行され、CREATE OR REPLACE の OR、ON DELETE CASCADE の ON、WITH ROLLUP の WITH も同じです。逆に CASE … WHEN … END と、値を並べた IN (1, 2, 3) は改行しないので、長くても一行に残ります。

複数の文と、コメントの居場所

セミコロンで繋いだ複数の文は、次の文の最初のキーワードで改行されるので、文の間はたいてい分かれます。-- の行コメントはもともと付いていた行の末尾にそのまま残り、/* */ は目印に置き換えてから戻すので、中の改行まで保たれます。ただし一行を独り占めしていたブロックコメントは、前の行の末尾に付きます。

よくある質問

どのデータベースに対応していますか

すべてです。意味を解析しないからで、キーワードと括弧だけで区切っています。その代わり、結合の書き換えのような判断を伴う提案はできません。

文字列リテラルの中でも改行しますか

しません。引用符の中とコメントはそのまま運びます。文字列の中のキーワードに反応する整形器は、あなたのデータを書き換えていることになります。

引用符の中のキーワードも整形されますか

されません。文字列の中身には触れません。値としての 'FROM' で改行してしまえば、クエリが壊れます。

キーワードを大文字にしますか

「キーワードを大文字に」を有効にすると、行を分ける位置のキーワード(SELECT・FROM・WHERE・JOIN など)だけを大文字にします。既定では有効で、外せば打った通りのまま残します。どちらも構文ではなく慣習なので、チームの決まりに合わせてください。列名や文字列の中の文字には触れません。

ある行から後ろが全部一段下がっています。

閉じていない括弧があります。インデントは括弧を数えて決めるので、開き括弧が一つ余ると、その後ろの行がすべて一段内側に入ります。実行すれば構文エラーになる場所なので、むしろ見つけやすくなります。文字列とコメントの中の括弧は数えません。

貼り付けたものはサーバへ送られますか

送られません。すべてブラウザの中で動き、送信も保存もしません。だからこそ、ふつうならウェブページに貼り付けない社内の設定ファイルや本番のクエリにも使えます。通信を切ったままでも動きます。