SQLの整形について
SQLは、たいてい1本の長大な行としてやってきます。ORMのログから、バグ報告から、誰かのクリップボードから。問題なく動くのに、まったく読めません。そして探している箇所は、その真ん中のどこかにあります。
貼り付ければ、組み上がった形で返ってきます。 1句1行、SELECTの下に列をインデント、JOINとそのON条件をそろえて並べるので、クエリの形が一目で見えます。
使い方
- 左の欄にSQLを貼り付けます。入力に合わせて、色分けされた整形結果が右に現れます
- お好みでインデント、キーワードの大文字小文字、カンマの位置を変えてください。結果はすぐに更新されます
- コピーするか、.sqlファイルとしてダウンロードします
- 1行に圧縮に切り替えると1行に戻ります。そのまま入力を続けてもこのモードは保たれます
整形のために押すボタンはありません。結果を変えるボタンは整形と1行に圧縮の2つだけで、
これはどちらを表示するかを選ぶものです。
色は、クエリの同じ読み取りから来ています
出力の色分けは、整形したのと同じトークナイザを仕上がったテキストにもう一度走らせて付け
ています。キーワードはシアン、文字列は黄、数値はオレンジ、コメントは灰、記号はピンク、そし
てあなたのテーブル名や列名は素のままにして、まわりのSQLから浮かび上がるようにしています。
これは見た目以上の意味があります。クエリを一度読み取った結果がレイアウトと色の両方を作るの
で、二つが食い違うことはありえません。文字列として塗られているものは、整形側も確かに文字列
として扱ったものです。どこかで引用符が閉じていなければ、色がそのまま流れて位置を教えてくれ
ます。たいていは目で探すより速い方法です。
コピーとダウンロードが渡すのはプレーンテキストです。 色付きのマークアップではありません。
気をつけている2つのこと
手早いSQL整形ツールの多くは正規表現で動いており、この2点こそ、その方式が崩れるところです。
- 文字列とコメントの中は決して見ません。 WHERE note = 'from a, b'を含むクエリには、文字列リテラルの中にキーワードとカンマと空白があります。正規表現の整形はそこで行を折り、クエリの意味を変えてしまいます。この道具はまずクエリをトークンに読み取るので、リテラルの中身は空白まで含めて入ったとおりに出ていきます
- 識別子は書いたままの大文字小文字を保ちます。 大文字小文字を変えるのはキーワードだけです。大文字小文字を区別するサーバーではuserIdとuseridは別の列であり、それを「整えて」しまう整形ツールは、見た目のためにクエリを壊したことになります
引用のしかたはすべて理解します。''でエスケープする'文字列'、"引用符付き識別子"、MySQLの バッククォート 、SQL Serverの[角かっこ]、PostgreSQLの$$ ドル引用 $$。
設定できること
- インデント — 半角スペース4つ、2つ、またはタブ
- キーワード — 大文字、小文字、または書いたそのまま
- カンマ — 行の末尾、あるいは社内の作法がそうなら行の先頭
1行に圧縮
圧縮すると、クエリは1行に戻ります。空白は、取り除くと意味が変わる場所や新しいトークンができてしまう場所にだけ残すので、安全な範囲でいちばん短くなります。
行コメントは落とされます。すべてが1行になると-- このようなコメントが残りを飲み込んでしまうからです。ブロックコメントは書かれたとおりに残ります。
こんなときに使われています
- ORMのログに出たクエリを読めるようにする
- プルリクエストやマイグレーションに入れる前にSQLを整える
- 他人が書いた長いクエリを理解する
- バグ報告の中のクエリを、作業できる形にする
- 設定ファイルやシェルコマンド用にクエリを1行に収める
- コミット前に.sqlファイルのフォルダの書き方をそろえる
知っておくとよいこと
- クエリはこのページに留まり、どこにも送信されません。実際のテーブル名や列名が入っているときに便利です
- これはSQLを組み上げる道具で、妥当かどうかは検査しません。構文エラーのあるクエリも、拒否せずできる限り整形します
- 方言ごとの引用には対応しますが、方言どうしの書き換えはしません
- 非常に大きなクエリでも大丈夫です。あなたの端末の中で単純な処理をしているだけです
- すべてのブラウザで動き、スマホでも使えます
関連ツール
- JSON整形ツール — JSONに対する同じ作業
- CSVをJSONに — クエリが返したデータを変換する
- 複数ファイルを一括置換 — フォルダ内の.sqlファイル全体でテーブル名を変える
- テキスト差分チェッカー — クエリの2つの版を比べる
- 正規表現テスター — 検索する前にパターンを組み立てる