SQL開発環境(ツール)の一ジャンルとしてSQL整形という機能があります。
A5:SQL Mk-2でもこれまで、SQL整形機能がありました。これまでも他の同種のSQL整形ツールと比べても高速かつ高機能だったと自負しているのですが、本日公開した Version 2.3 beta 25ではさらに空白の取り扱い(付加・除去)について整形ルールを見直して、より高精度なSQLを出力できるようにしました。目標は「SQLのコードレビューをしてもそのまま通れるSQL」です。
また高速性についても、これまで、通常のSQL整形はかなり高速だったのですが、むしろ複数行から1行への整形(SQLを1行にする)は遅かったのでデータ構造を見直し、かなりの高速化を達成しました。
100KBや、1MBほどの整形を他のSQL整形ツールと比較するとその高速性が確認できると思います。他のSQL専用ツールと比較して、数倍から数十倍の速度差が付くこともあります。(まあ、そんなに大きなSQLはないでしょうけどね。でも一度Hibernateの自動生成した、50KBのSQL(しかも1行)を見たことがあります。)
http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/beta/index.html
SQL整形例
-整形前---------------------------
--1行コメント
select distinct a . * -- 1行コメント
,func1(a . aaa+1*2*3/4),"a"."aaa"||'aaa'+1,func2(func3
( 123 )),( 1+( 2*3 ) ),@@SQLSERVER_ENV as"aaa",case a . bbb when '1' then
'一' when '2' then '二' else '' end , case when a. fff = 'ccc' then 'O' else
'X' end,case a .fff when '1' then case when a. ggg = 'ccc' then 'O' else 'X'
end when '2' then (case when a. hhh = 'ccc' then 'O' else 'X' end) else '' end
from TB_NAME a inner join (select カラム1,カラム2,カラム3 from テーブル名 where
カラム1 != カラム2) テ on a.aaa=テ.カラム1where a . aaa=@aaa AND テ . カラム2 =
:bbb and a.ccc >= 3 and a.ddd <= 4 and a.eee != 5 and `a` . `MySQL Identifier `=333
and [a] . [SQLServer Identifier ]=2.2 and(1=1 or (2=2)) union select * from (select *
from TB_NAME4);insert into TB_NAME(aaa, bbb, ccc) values (111, 222, 333);update TB_NAME4
set BBB=1*2+3 ,CCC = sysdate where AAA=:aaa;delete from TB_NAME5 where :aaa=AAA;with SUBQ
as (select * from TB_NAME5) select * from SUBQ
----------------------------------
-整形後---------------------------
--1行コメント
select distinct
A.* -- 1行コメント
, FUNC1(A.AAA + 1 * 2 * 3 / 4)
, "a"."aaa" || 'aaa' + 1
, FUNC2(FUNC3(123))
, (1 + (2 * 3))
, @@SQLSERVER_ENV as "aaa"
, case A.BBB
when '1' then '一'
when '2' then '二'
else ''
end
, case
when A.FFF = 'ccc'
then 'O'
else 'X'
end
, case A.FFF
when '1' then case
when A.GGG = 'ccc'
then 'O'
else 'X'
end
when '2' then (case when A.HHH = 'ccc' then 'O' else 'X' end)
else ''
end
from
TB_NAME A
inner join (
select
カラム1
, カラム2
, カラム3
from
テーブル名
where
カラム1 != カラム2
) テ
on A.AAA = テ.カラム1WHERE A.AAA = @AAA
and テ.カラム2 = :BBB
and A.CCC >= 3
and A.DDD <= 4
and A.EEE != 5
and `a`.`MySQL Identifier ` = 333
and [a].[SQLServer Identifier ] = 2.2
and (1 = 1 or (2 = 2))
union
select
*
from
(select * from TB_NAME4);
insert
into TB_NAME(AAA, BBB, CCC)
values (111, 222, 333);
update TB_NAME4
set
BBB = 1 * 2 + 3
, CCC = SYSDATE
where
AAA = :AAA;
delete
from
TB_NAME5
where
:AAA = AAA;
with SUBQ as (select * from TB_NAME5)
select
*
from
SUBQ
----------------------------------