SQL
SQL整形でクエリの意味が変わる? 文字列とコメントで起きる落とし穴と確かめ方
著者: Automanager

整形したSQLは、整形前と同じ意味のままでしょうか。
はじめに
SQL整形ツールは、改行と字下げを入れて読みやすくするためのものです。クエリの意味は変わらない、という前提で使っている人がほとんどだと思います。
ところが、整形ツールの作りによっては、文字列やコメントの中まで書き換えてしまい、クエリの意味が変わることがあります。
このサイトのSQL整形ツールも、2026年11月に作り直すまでは、この問題を抱えていました。サイト全体の見直しをAI(Claude Code)に手伝ってもらったとき、SQL整形ツールに文字列やコメントを含むSQLを入れて確かめたところ、出力が壊れていることが分かりました。整形処理は、SQLを解析するライブラリに置き換えました。
この記事では、以前の整形処理と今の整形処理に同じSQLを入れた実際の出力を並べて、何が起きるのかと、整形後のSQLを確かめる方法を整理します。
1. 実例:文字列の中のキーワードが書き換わる
次のSQLは、note 列に「from」という文字を含む行を探します。
SELECT name FROM products WHERE note LIKE '%from%'
以前の整形処理では、次のように出力されていました。
SELECT
name
FROM
products
WHERE
note LIKE '%
FROM
%'
'%from%' の中に改行が入り、from も大文字の FROM に変わっています。文字列の中身が変わったので、このまま実行すると、探す条件が整形前とは別のものになります。
今の整形処理では、文字列の中には手を加えません。
SELECT
name
FROM
products
WHERE
note LIKE '%from%'
2. 実例:コメントの中の単語が、コメントの外に出る
コメントに select などの単語が入っている場合です。
SELECT id, name -- select only active users
FROM users WHERE active = 1
以前の整形処理の出力です。
SELECT
id, name --
SELECT
only active users
FROM
users
WHERE
active = 1
-- から行末まではコメントですが、select の前で改行されたため、SELECT only active users がコメントの外に出ています。SQLとしては、もう正しく読めません。
今の整形処理では、コメントはそのまま残ります。
SELECT
id,
name -- select only active users
FROM
users
WHERE
active = 1
列の別名に "order by" のような名前を付けた場合も、以前の整形処理では引用符の中で改行され、別名が壊れていました。
3. 原因:文字の置き換えで整形していた
以前の整形処理は、SELECT や FROM などのキーワードを正規表現で探し、前後に改行を入れる作りでした。この方法では、見つけた単語が文字列の中なのか、コメントの中なのかを区別できません。
今は、オープンソースのライブラリ「sql-formatter」を使っています。SQLを文字列、コメント、キーワードなどに分けてから整形するので、文字列とコメントの中身は変わりません。
整形ツールを選ぶときは、文字列やコメントを区別して整形しているかを、一度確かめておくと安心です。
4. 確かめ方:整形の前後で意味が変わっていないか
整形したSQLを本番で使う前に、次の点を確認します。
- 文字列とコメントを目で比べる。
'...'や"..."の中、--や/* */の中が整形前と同じかを見ます。上の例のように、変わるのはこの部分です - 空白と大文字・小文字を無視した比較だけに頼らない。 1つ目の例では、空白を取り除き、大文字と小文字を区別せずに比べると、整形前と同じに見えてしまいます。実際には文字列の中に改行が入っています
- テスト用のデータベースで、整形前と整形後のSQLを両方実行し、結果を比べる。 件数や返る行が同じかを確かめるのが、いちばん確実です
私が実務で意識しているのは、次の点です。
- SELECT文は、JOINの条件やWHEREの条件を自分でも念入りに確認し、気になる場合はチーム内でレビューする
- INSERTやUPDATEは、本番環境での実施は基本的にNG。そもそも、本番環境のDBに直接INSERTやUPDATEをしなければならない状況自体、運用を見直す必要がある。どうしても必要な場合は、複数人でのレビューを実施して品質を担保する
まとめ
- 整形ツールの作りによっては、文字列やコメントの中まで書き換えて、クエリの意味が変わることがある
- 原因は、キーワードを文字の置き換えで探していることにある
- 整形後は、文字列とコメントの中身を確かめ、できればテスト用のデータベースで結果を比べる
このサイトのSQL整形ツールは、今はsql-formatterで整形しており、文字列とコメントの中身は変えません。入力したSQLはブラウザの中で処理し、送信しません。