てもとツール
ツール紹介

SQLを読める形に整形する手順|ログの値の当て方も

1 行に詰まった SQL を読める形に整形する手順をまとめました。方言が自動で決まる仕組み、ログに残ったプレースホルダへ値を当てる操作、値が足りないときの表示、読めなかったときに出る行と桁の案内までを画面で追います。

公開読了目安 約4分

この記事の要点

  • 方言は既定で自動に探して結果に名前が出る
  • 整形の前後でトークン数を突き合わせて示す
  • ログの値を貼るとプレースホルダに入る
  • 値が足りないときは残した件数が出る
  • 読めないときは行と桁が日本語で出る
目次

ログに残る SQL は、たいてい 1 行に詰まっています。どこからが条件で、どの表とつないでいるのかを、目で数えることになります。

貼り付けるだけで読める形に並べ直すのが SQL整形ツール です。ログに出ていた値も一緒に貼れます。

SQL整形ツールの入力欄。1行に詰まったSELECT文が貼り付けられており、その下に「値を当てる(プレースホルダ)」と「詳細設定」の折り畳み、整形する・1行にする・クリアの3つのボタンが並んでいる

貼り付けて押すところまでは 2 手

入力欄に SQL を貼り、「整形する」を押します。それだけで結果が出ます。

設定を開く必要はありません。字下げはスペース 2 つ、予約語は大文字が既定です。

方言は自動で探して、決まった名前が出る

SQL には方言があります。同じ書き方でも、データベースによって読めたり読めなかったりします。

このツールは既定で「自動で探す」になっています。標準 SQL から順に試し、最初に読めたものを使います。

整形結果。上に「方言: 標準SQL」のラベルとコピーボタンがあり、SELECT・FROM・WHERE・ORDER BY・LIMIT が行頭にそろった10行あまりのSQLが表示されている

大事なのは、どれで読めたかが結果の上に出ることです。「方言: 標準SQL」のように名前で出ます。

黙って決めないので、意図と違えば詳細設定で選び直せます。

整形の前後でトークンの数を突き合わせる

結果の下に「整形の前後でトークン 48 個が一致しました」と出ます。これは見た目の話ではありません。

貼った SQL と出てきた SQL を、それぞれ語・数値・記号・文字列に分けて並べ、空白を除いた並びが同じかを比べています。

整形で語が落ちていないことを、数で確かめられます。文字数ではなくトークンの数なので、改行や字下げが増えても値は変わりません。

ログの ? に値を当てる

ログの SQL は、値が別の行に分かれていることがほとんどです。WHERE created_at BETWEEN ? AND ? だけ見ても、いつのデータなのか分かりません。

「値を当てる(プレースホルダ)」を開いて、ログに出ていた値を貼ります。

値を当てた結果。WHERE 句が o.created_at BETWEEN '2026-09-01' AND '2026-09-30' になり、その下に「プレースホルダ 2 件のうち、2 件に値を当てました。」と、? → '2026-09-01' / ? → '2026-09-30' の内訳が並んでいる

受け取り方は 4 通りあります。JSON の配列、JSON のオブジェクト、1 行 1 値、カンマ区切りです。

["2026-09-01", "2026-09-30"] のように貼れば、? の位置へ順番に入ります。文字列には引用符が付き、数値には付きません。

当てた結果は 1 件ずつ並びます。? → '2026-09-01' のように、どの箇所に何が入ったかを目で確かめられます。

文字列の中の ? は動かない

WHERE memo = 'なぜ?' のような書き方でも、この ? は置き換わりません。値を当てる前に文字列とコメントの範囲を先に取っているためです。

内訳の件数にも数えません。画面に出る件数と、実際に置き換わった箇所の数は一致します。

値が足りないときは残した件数が出る

貼った値がプレースホルダより少ないことがあります。ログを途中で切ってコピーしたときによく起こります。

値が1つしかないときの表示。プレースホルダ 2 件のうち、1 件に値を当てました。値が無くて残したものが 1 件あります。と表示され、SQL の片方は ? のまま残っている

このとき残りの ? はそのまま残ります。そして「値が無くて残したものが 1 件あります」と出ます。

黙って埋めないので、貼り忘れに気づけます。逆に値が余ったときも「使わなかった値が N 件あります」と出ます。

読めなかったときは行と桁が日本語で出る

括弧の閉じ忘れや、その方言では使えない書き方があると、整形は止まります。

このとき出るのは英語のパースエラーではありません。「1 行 49 桁の「$1」が読めません」のように、行と桁と該当箇所が日本語で出ます。

その下に読めなかった行そのものと、桁を指す ^ が並びます。どの文字で止まったかを数えなくて済みます。

読める方言が別にあれば、その名前も一緒に出ます。どれも読めなければ「どの方言でも読めませんでした」と書きます。

プログラムへ戻すときは 1 行にする

整形は読むための形です。ソースコードへ埋め込むときは逆に 1 行へ戻したくなります。

「1 行にする」を押すと、改行と余分な空白がまとまります。文字列の中の空白はそのまま残ります。

行コメントの後ろだけは改行を残します。ここを詰めると、続きがコメントに飲まれて意味が変わるためです。

補足: 開発者の方へ

整形の本体には npm の sql-formatter を使っています。ボタンを押したときに動的インポートで読み込むので、ほかのページの表示には影響しません。

プレースホルダの検出と、整形前後のトークン照合は自前の字句解析器で行っています。ドル引用符 $$...$$、角括弧の識別子 [col]、:: のキャスト、@@ のシステム変数を区別します。

値を当てた SQL は、ログを読むためのものです。プレースホルダは値を連結しないための仕組みなので、埋めた形をそのまま実行する用途には向きません。

整形が通っても、SQL として正しいとは限りません。select from where のような文字列もエラーにならずに並び替わります。

文法の確認は、お使いのデータベース管理ツールで行ってください。

貼ったSQLがそもそも整形できないときの切り分けは、SQLが整形できない原因と方言の選び直し方にまとめています。

あわせて読みたい

同じテーマ・関連ツールの記事です。