takakisan

【VSCode】SQLフォーマットプラグイン3種比較

2020-11-23

こんにちはー。

開発をしていて、ログから拾ったSQLを見たいときに、改行などのフォーマットを整えないと見づらいですよね。
Visual Studio Codeのプラグインには、SQLのフォーマットを整えてくれるものがありますが、フォーマットした結果が結構違うので、比べてみました。

まとめ

SQL Formatter

Marketplace

一番おすすめ。

SQLTools

Marketplace

まあ、悪くはないけど、微妙。

SQL Beautify

Marketplace

癖が強すぎる。

フォーマットの結果を確認

動作確認用に、ちょっと込み入ったSQLを書いてみました。

select * from (select team_name, team_score_total, member_name, member_score_total, rank() over (partition by team_id order by member_score_total desc) member_rank from (select teams.id team_id, teams.name team_name, team_scores.score_total team_score_total, members.id member_id, members.name member_name, member_scores.score_total member_score_total from teams inner join members on teams.id = members.team_id inner join (select teams.id team_id, sum(scores.score) score_total from teams inner join members on teams.id = members.team_id inner join scores on members.id = scores.member_id and scores.created_at >= '2020-10-01' and scores.created_at < '2020-11-01' group by teams.id) team_scores on teams.id = team_scores.team_id inner join (select members.id member_id, sum(scores.score) score_total from members inner join scores on members.id = scores.member_id and scores.created_at >= '2020-10-01' and scores.created_at < '2020-11-01' group by members.id) member_scores on members.id = member_scores.member_id where teams.area_id = 5) with_rank) where member_rank <= 3 order by team_score_total desc;

チームごとのメンバーのスコア合計上位者を3人ずつ、チームのスコア合計が高い順に取得、、みたいな妄想で作ったSQLです。

プラグインをインストールして、エディタの言語モードをSQLにした状態で、
Option + Shift + Fでフォーマットできます。

それぞれのプラグインを使ってフォーマットした結果を見ていきましょう。

SQL Formatter

Marketplace

フォーマットした結果がこちら。

select
  *
from
  (
    select
      team_name,
      team_score_total,
      member_name,
      member_score_total,
      rank() over (
        partition by team_id
        order by
          member_score_total desc
      ) member_rank
    from
      (
        select
          teams.id team_id,
          teams.name team_name,
          team_scores.score_total team_score_total,
          members.id member_id,
          members.name member_name,
          member_scores.score_total member_score_total
        from
          teams
          inner join members on teams.id = members.team_id
          inner join (
            select
              teams.id team_id,
              sum(scores.score) score_total
            from
              teams
              inner join members on teams.id = members.team_id
              inner join scores on members.id = scores.member_id
              and scores.created_at >= '2020-10-01'
              and scores.created_at < '2020-11-01'
            group by
              teams.id
          ) team_scores on teams.id = team_scores.team_id
          inner join (
            select
              members.id member_id,
              sum(scores.score) score_total
            from
              members
              inner join scores on members.id = scores.member_id
              and scores.created_at >= '2020-10-01'
              and scores.created_at < '2020-11-01'
            group by
              members.id
          ) member_scores on members.id = member_scores.member_id
        where
          teams.area_id = 5
      ) with_rank
  )
where
  member_rank <= 3
order by
  team_score_total desc;

かなりいいですね。

個人的には

            from
              teams
              inner join members on teams.id = members.team_id
              inner join scores on members.id = scores.member_id
              and scores.created_at >= '2020-10-01'
              and scores.created_at < '2020-11-01'

これは

            from
              teams
              inner join
              members
                on
                  teams.id = members.team_id
              inner join
              scores
                on
                  members.id = scores.member_id
                  and scores.created_at >= '2020-10-01'
                  and scores.created_at < '2020-11-01'

こう書きたかったりしますが、まあおおむねいい感じです。

SQLTools

Marketplace

フォーマットした結果がこちら。

select *
from (
		select team_name,
			team_score_total,
			member_name,
			member_score_total,
			rank() over (
				partition by team_id
				order by member_score_total desc
			) member_rank
		from (
				select teams.id team_id,
					teams.name team_name,
					team_scores.score_total team_score_total,
					members.id member_id,
					members.name member_name,
					member_scores.score_total member_score_total
				from teams
					inner join members on teams.id = members.team_id
					inner join (
						select teams.id team_id,
							sum(scores.score) score_total
						from teams
							inner join members on teams.id = members.team_id
							inner join scores on members.id = scores.member_id
							and scores.created_at >= '2020-10-01'
							and scores.created_at < '2020-11-01'
						group by teams.id
					) team_scores on teams.id = team_scores.team_id
					inner join (
						select members.id member_id,
							sum(scores.score) score_total
						from members
							inner join scores on members.id = scores.member_id
							and scores.created_at >= '2020-10-01'
							and scores.created_at < '2020-11-01'
						group by members.id
					) member_scores on members.id = member_scores.member_id
				where teams.area_id = 5
			) with_rank
	)
where member_rank <= 3
order by team_score_total desc;

人により好みが分かれるところではありますが、個人的に気になるのは

  • select、from等の後で改行してほしい
  • スペースでインデントしてほしい
  • なんでfromの後のインデント2段なの?

とかですかねー。

SQL Beautify

Marketplace

フォーマットした結果がこちら。

SELECT  *
FROM
(
	SELECT  team_name
	       ,team_score_total
	       ,member_name
	       ,member_score_total
	       ,rank() over (partition by team_id ORDER BY member_score_total desc) member_rank
	FROM
	(
		SELECT  teams.id team_id
		       ,teams.name team_name
		       ,team_scores.score_total team_score_total
		       ,members.id member_id
		       ,members.name member_name
		       ,member_scores.score_total member_score_total
		FROM teams
		INNER JOIN members
		ON teams.id = members.team_id
		INNER JOIN
		(
			SELECT  teams.id team_id
			       ,SUM(scores.score) score_total
			FROM teams
			INNER JOIN members
			ON teams.id = members.team_id
			INNER JOIN scores
			ON members.id = scores.member_id AND scores.created_at >= '2020-10-01' AND scores.created_at < '2020-11-01'
			GROUP BY  teams.id
		) team_scores
		ON teams.id = team_scores.team_id
		INNER JOIN
		(
			SELECT  members.id member_id
			       ,SUM(scores.score) score_total
			FROM members
			INNER JOIN scores
			ON members.id = scores.member_id AND scores.created_at >= '2020-10-01' AND scores.created_at < '2020-11-01'
			GROUP BY  members.id
		) member_scores
		ON members.id = member_scores.member_id
		WHERE teams.area_id = 5
	) with_rank
)
WHERE member_rank <= 3
ORDER BY team_score_total desc;

うーん。独特ですね。

個人的には結構嫌です。嫌なポイントとしては

  • 大文字にしないでほしい
  • selectの後の2つスペースなの何で?
  • selectの列挙をスペースで縦揃えしないでほしい
  • タブとスペース混ぜないでほしい
  • select、from等の後で改行してほしい
  • 行末カンマにしてほしい
  • from, inner join, onが同じ深さになるのが納得行かない
  • onの条件は改行して書いてほしい

この辺ですね。。。

以上です。

スポンサーリンク