top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
SQLコーディング規約 (字下げ規約) について、これを策定する作業に着手しました。
いがぴょん勝手仕様によるSQLコーディング規約 (というか単に字下げルールですが) を策定着手しました。これは 私が受け入れ単体試験・結合試験などに従事している過程で、SQL文の字下げによるオフサイドトラップにかかって悲しい思いをする経験が多くあって、これを何とか SQL整形ツールで防ぎたい、というのが主な着手理由です。
重要なことは、ここで決まった SQLコーディング規約 (というか字下げ規約) に基づいた SQLパーサやSQL整形ツール、果ては Eclipseプラグインといった Java言語による実装が開発される(らしい)ということです。(いがぴょんが開発するわけではありませんし、いがぴょんにそのスキルはありません)とりあえず慣習的なSQLコーディング規約について最低限は尊重して踏襲しつつも、Eclipse/Java風のルールも強く意識しながら まずは素案を作成開始しました。
原則
SQLキーワードは大文字とする。
4および8文字の空白による字下げを行うこととする。タブ文字は クオートやコメント内で無い限り、基本的にホワイトスペースとみなして半角スペースに置き換えられる。
列を列挙する際に利用する カンマ(,)については、行の先頭に付け、カンマの後に空白は入れない。 →これは どろどろの開発現場の多くで良く採用されるコーディング規約なのだそうです。
原則論としては、Java言語の字下げ (Eclipseのデフォルトの整形) を参考にする。
どろどろのSQL文では 列数などがやたらに多いことがあるので、原則 全ての列について改行して表現する。 逆に、1行の最大の長さについては、これを規定しない。
カッコ '(', ')' については、Java風の改行および字下げを参考とする。(ANSI-C風ではない点に注目)
SELECT その1 W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W S E L E C T
c o l 1
, c o l 2
, c o l 3
, c o l 4
, c o l 5
, c o l 6
, c o l 7
, c o l 8
, M A X
( c o l 1 )
A S
m a x c o l 1
F R O M
t a b l e 1
t 1
, t a b l e 2
t 2
W H E R E
t 1 . c o l 1
=
t 2 . c o l 2
O R
c o l 1
3
O R
c o l 2
<
5
O R D E R
B Y
c o l 1
D E S C ※ポイント: SELECTキーワードは先頭に位置づけ。FROM, WHEREなどは 4字下げ。表名、列名などは 8字下げ。カンマについてはSQLの伝統を重んじ(Javaとは異なり)、先につけるようにする。ORについて Java言語の || と同様のものであると認識し、同様の字下げとする。 * ORDER BY 以外に GROUP BY にも対応が必要。
DISTINCT キーワードへの対応が必要。
単一の項目を含む場合の カッコ() については、別扱いとして 改行を含まない。
INキーワードへの対応も必要。それ以外にも INで値を列挙する形や、INの後続にSELECT文を書く形があることに注意。
INSERT その1 W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W I N S E R T
I N T O
t a b l e 1
V A L U E S
(
1 0 0 0
, ' A B C '
, 2 5 6
) ※ポイント: INSERTキーワードは先頭に位置づけ。INTO, VALUESなどは 4字下げ。丸カッコ'(' ')' については、Java言語の '{', '}' の字下げルールを採用 INSERT その2 W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W I N S E R T
I N T O
" t a b l e
n a m e 1 "
(
c o l 1
, c o l 2
, c o l 3
)
V A L U E S
(
1 0 0 0
, ' A B C '
, 2 5 6
)
※ポイント: INSERTキーワードは先頭に位置づけ。INTO, VALUESなどは 4字下げ。丸カッコ'(' ')' については、Java言語の '{', '}' の字下げルールを採用。 * 表名・列名は ダブルクオート(")で囲むことが可能。ダブルクオート内は 空白などが入り得ます。ダブルクオートやシングルクオートの箇所については、整形は行わない。
UPDATE その1 W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W U P D A T E
t a b l e 1
S E T
c o l 2
=
' A B C '
, c o l 3
=
1 2 3
W H E R E
c o l 1
=
5
※ポイント: UPDATEキーワードは先頭に位置づけ。SETなどは 4字下げ。 DELETE その1 W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W D E L E T E
- -
s i n g l e
l i n e
c o m m e n t
F R O M
/ *
m u l t i
l i n e
c o m m e n t
c o m m e n t
p a r t
i s
i g n o r e d
* /
t a b l e 1
W H E R E
c o l 1
=
5
※ポイント: DELETEキーワードは先頭に位置づけ。FROM, WHEREなどは 4字下げ。 * -- から始まる文字列は一行コメントなので、行末までそのままとし、コメント部分は整形しない。
UNION その1 W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W S E L E C T
c o l 1
, c o l 2
, c o l 3
, c o l 4
, c o l 5
, c o l 6
, c o l 7
, c o l 8
F R O M
t a b l e 1
W H E R E
c o l 1
3
O R
c o l 2
<
5
O R D E R
B Y
c o l 1
U N I O N
S E L E C T
c o l 1 1
, c o l 1 2
, c o l 1 3
, c o l 1 4
, c o l 1 5
, c o l 1 6
, c o l 1 7
, c o l 1 8
F R O M
t a b l e 2
W H E R E
c o l 1 1
3
O R D E R
B Y
c o l 1 1
※ポイント: UNIONとSELECTキーワードは先頭に位置づけ。 サブクエリ その1 W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W S E L E C T
c o l 1
, c o l 2
, c o l 3
, c o l 4
, c o l 5
, c o l 6
, c o l 7
, c o l 8
F R O M
t a b l e 1
W H E R E
E X I S T S
(
S E L E C T
c o l 1
F R O M
t a b l e 2
W H E R E
c o l 1
=
3
)
※ポイント: サブクエリについて、( ) カッコの動きをうまく適用して汎化したルールを適用すること。 2005.06.14 ymotoさんのフィードバックを反映
2006.05.10追記 ここで策定されたコーディング規約に従ったSQL整形ライブラリを実現するblancoSqlFormatterや、SQL整形EclipseプラグインのBlancoSqlEditorPlugin などが blanco Framework から提供されています。
関連するリソース
関連する日記
2005/07/29 日記: SQLを整形するEclipseプラグイン - BlancoSqlEditorPlugin 初の正式版リリース Eclipse用 SQL整形プラグインの正式版をリリースしました。
2005/07/04 日記: Javaで書かれたフリーなSQL整形ライブラリ「BlancoSqlFormatter」β版リリース