ブログ
日本語

SQL 整形 — SQLフォーマッターでクエリを見やすくインデント

SQLを整形(MySQL・PostgreSQLなどの方言、キーワードの大文字・小文字、インデント)

ブラウザー内で処理・アップロード不要

キーワードの大文字・小文字
インデント

整形後のSQL

SQL 整形ツールとは

ログやORMからコピーしたクエリは、1行に詰まっていたりインデントがばらばらだったりして、読むのもレビューするのも大変です。このツールはSQLをSELECT、FROM、WHEREなどの句ごとに改行し、一貫したインデントを付けます。入力に合わせて結果が更新されます。

使い方

  1. 入力欄にSQLを貼り付けます。セミコロンで区切った複数の文でも大丈夫です。
  2. データベースに合った方言を選びます。
  3. キーワードを大文字・小文字・入力どおりのどれにするか選びます。
  4. インデントをスペース2つ、スペース4つ、タブから選び、結果をコピーします。

仕組み

  • 整形はオープンソースのsql-formatterライブラリーが行います。入力をトークンに分け、句や括弧の深さから改行とインデントを決めます。
  • 対応する方言は標準SQL、MySQL、PostgreSQL、MariaDB、SQLite、BigQuery、Oracle(PL/SQL)、SQL Server(T-SQL)です。方言によって、識別子のクォート(`、"、[ ])、パラメーターの記号(?、$1、@name)、演算子の読み方が変わります。
  • MyBatisのプレースホルダー#{id}、#{name,jdbcType=VARCHAR}、${table}は、どの方言でもそのまま残します。MySQLでは通常#がコメントの開始ですが、#{はプレースホルダーとして扱います。複数行にまたがるプレースホルダーも残せますが、#{list[${i}]}のような波括弧の入れ子には対応していません。
  • バインドパラメーター:標準SQL・MySQL・MariaDBは?と:name、PostgreSQLは$1と:name、Oracleは:name、SQL ServerとBigQueryは@name、SQLiteは?、?1、:name、@name、$nameを受け付けます。
  • エラーでは、解析が止まった行・列・テキストを示します。
  • キーワードの大文字小文字のオプションは予約語にだけ適用されます。文字列リテラル・コメント・識別子(日本語のテーブル名や列名を含む)は変更しません。
  • タブのオプションでは、インデント1段につきタブ文字1つを使います。
  • 行うのは整形だけです。クエリを実行したり、意味をチェックしたりはしません。

例

入力:

select id, name from users where age > 20 and city = '東京' order by name

結果(標準SQL、大文字、スペース2つ):

SELECT
  id,
  name
FROM
  users
WHERE
  age > 20
  AND city = '東京'
ORDER BY
  name

よくある質問

クエリはサーバーに送信されますか?

いいえ。整形はsql-formatterライブラリーを使ってブラウザー内で行い、クエリが送信・保存されることはありません。とはいえ、本物のパスワードや個人情報を含むクエリを共有画面に表示するのは避けてください。

どの方言を選べばいいですか?

使っているデータベースを選んでください。MySQLのバッククォート、PostgreSQLの`::`キャストや`$1`パラメーターなど、方言ごとの構文を正しく認識できるようになります。わからなければ、まず標準SQLを試してください。

整形するとクエリの動作が変わることはありますか?

変わるのは空白・改行・キーワードの大文字小文字だけです。文字列リテラル・コメント・識別子の中身はそのままで、キーワードの大文字小文字を変えてもクォート内の値には触れないので、クエリの動作は変わりません。

エラーが表示された場合はどうすればいいですか?

閉じていないクォートや、選んだ方言が対応していない記号があると、パーサーが止まることがあります。メッセージに示された箇所を確認するか、別の方言を試してください。これは整形ツールであって構文チェッカーではないため、SQLの誤りをすべて見つけられるわけではありません。

ほしいツールはありますか?