オフラインで使えるSQL整形ツールを比較しました。
開発現場では、オフラインで使えるSQL整形ツールが求められることがあります。今回は、VisualStudioCode、秀丸エディタ、SAKURAエディタのプラグインやマクロを使ったSQL整形について比較してみます。
なお、整形対象のSQLには、以前紹介したオンラインSQL整形ツール「Instant SQL Formatter」のサンプルSQLを使用します。
select i.obj#,i.samplesize,i.dataobj#,nvl(i.spare1,i.intcols),i.spare6,decode(i.pctthres$,null,null,mod(trunc(i.pctthres$/256),256)),ist.cachedblk,ist.cachehit,ist.logicalread from ind$ i, ind_stats$ ist, (select enabled, min(cols) unicols,min(to_number(bitand(defer,1))) deferrable#,min(to_number(bitand(defer,4))) valid# from cdef$ where obj#=:1 and enabled > 1 group by enabled) c where i.obj#=c.enabled(+) and i.obj# = ist.obj#(+) and i.bo#=:1 order by i.obj#
ギッチリと1行につめ込まれた、関数やサブクエリが入り混じった複雑極まるSQLです。
【関連記事】
▶SQL formatter オンラインで使える無料整形ツール 3選
オフラインSQL整形ツールの比較
visual studio codeはPL/SQLモードが優秀
マイクロソフト社製のソースコードエディタです。無料でダウンロードして使用可能です。
参考)Visual Studio Code – コード エディター 公式サイト
今回は、マーケットプレイスのSQL Formatterを使います。
参考)SQL Formatter – Visual Studio Marketplace
サンプルSQLを整形します。エディタ上でALT+SHIFT+Fで整形できます。
結果は、こうなりました。
select i.obj #,i.samplesize,i.dataobj#,nvl(i.spare1,i.intcols),i.spare6,decode(i.pctthres$,null,null,mod(trunc(i.pctthres$/256),256)),ist.cachedblk,ist.cachehit,ist.logicalread from ind$ i, ind_stats$ ist, (select enabled, min(cols) unicols,min(to_number(bitand(defer,1))) deferrable#,min(to_number(bitand(defer,4))) valid# from cdef$ where obj#=:1 and enabled > 1 group by enabled) c where i.obj#=c.enabled(+) and i.obj# = ist.obj#(+) and i.bo#=:1 order by i.obj#
これはひどい。selectの後ろに改行が入っただけです。
ところが、設定を少し変えるだけで見違える結果が出ます。
Ctrl+SHIFT+Xで拡張機能一覧を呼び出し、SQL Formatterの「拡張機能の設定を構成します」から、pl/sqlを選んで、再度SQL整形を実行します。
select i.obj #, i.samplesize, i.dataobj#, nvl(i.spare1, i.intcols), i.spare6, decode( i.pctthres$, null, null, mod(trunc(i.pctthres$ / 256), 256) ), ist.cachedblk, ist.cachehit, ist.logicalread from ind$ i, ind_stats$ ist, ( select enabled, min(cols) unicols, min(to_number(bitand(defer, 1))) deferrable#, min(to_number(bitand(defer, 4))) valid# from cdef$ where obj# = :1 and enabled > 1 group by enabled ) c where i.obj# = c .enabled(+) and i.obj# = ist.obj#(+) and i.bo# = :1 order by i.obj#
1行が長くなりそうな関数では適度に改行を入れ、サブクエリも見やすく整形するなど、非の打ち所がない整形結果です。
PL/SQLモードをデフォルトにすれば良いのでは、と思うほどの出来のよさ。
秀丸エディタは、行頭にカンマが来る
秀丸エディタには、作者の秀まるおさんご本人が作成した、SQL整形プラグインがあります。
「変換フィルタ」としてインストールし、メニューの編集→変換→SQL整形から実行します。
実行結果はこちら。
select i.obj# , i.samplesize , i.dataobj# , nvl(i.spare1, i.intcols) , i.spare6 , decode(i.pctthres$, null, null, mod(trunc(i.pctthres$/256), 256)) , ist.cachedblk , ist.cachehit , ist.logicalread from ind$ i , ind_stats$ ist , ( select enabled , min(cols) unicols , min(to_number(bitand(defer, 1))) deferrable# , min(to_number(bitand(defer, 4))) valid# from cdef$ where obj#=:1 and enabled > 1 group by enabled ) c where i.obj#=c.enabled(+) and i.obj# = ist.obj#(+) and i.bo#=:1 order by i.obj#
とても見やすいのですが、行頭にカンマが来るのは、好みが別れるところでしょう。
SAKURAエディタは、多重カッコの整形がやや苦手
SAKURAエディタには、「定番」と言われるレベルの有名なSQL整形マクロはありませんでした。
比較的新しい、こちらのマクロで整形してみます。
参考)SakuraEditorマクロでXML/JSON/CSS/SQLを整形するよ – Qiita
キーマクロとして読み込み、キーマクロの実行(Shift+Ctrl+L)で整形実行です。
整形結果はこうなりました。
SELECT i.obj#, i.samplesize, i.dataobj#, nvl(i.spare1, i.intcols), i.spare6, decode(i.pctthres$, null, null, mod(trunc(i.pctthres$/256), 256)), ist.cachedblk, ist.cachehit, ist.logicalread FROM ind$ i, ind_stats$ ist, (SELECT enabled, min(cols) unicols, min(to_number(bitand(defer, 1))) deferrable#, min(to_number(bitand(defer, 4))) valid# FROM cdef$ WHERE obj#=:1 AND enabled > 1 GROUP BY enabled) c WHERE i.obj#=c.enabled(+) AND i.obj# = ist.obj#(+) AND i.bo#=:1 ORDER BY i.obj#
「SELECT」や「FROM」などのキーワードを大文字化する点と、関数で使われる多重カッコを展開しすぎる点が気になりますが、整形品質としては充分でしょう。
ただ、個人の方がサンプル的に作成されたものなので、毎回整形種別(XML / JSON / CSS / SQL)を聞かれるなど使い勝手が良くない点もあります。
とは言っても、シンプルなコードで作られているため、好きなようにカスタマイズするのも難しくはないでしょう。
サクラエディタユーザにとっては、非常にありがたい情報です。
まとめ SQL整形ツールはVSCODEが優秀
複雑なSQL整形に強いのはVisual Studio Codeでした。
![](https://style.potepan.com/wp-content/plugins/lazy-load/images/1x1.trans.gif)
- visual studio codeは、PL/SQLで使うと整形性能が優秀
- 秀丸エディタは、カンマが行頭に来る
- サクラエディタは、多少気になる点はあるが及第点
とは言え、秀丸エディタ、サクラエディタが極端に劣っているというわけでもありません。手に馴染んだテキストエディタにSQL整形機能を持たせたいというあなたは、チェックしてみてください。