(-> % read write unlearn)

All opinions expressed are solely my own and do not express the views or opinions of my employer.

sublimetext3 SqlBeautifier でSQLを整形。

IntelliJSQLを整形する方法が分からなかったので、sublimetext3にSqlBeautifierを入れました。command+k, command+f*1SQLを整形してくれます。

適当にごちゃごちゃしたSQLを書いてみました。*2

SELECT i.item_name, i.cnt AS item_count,i.craeted_at,
CONCAT(i.attr_1, ', ', i.attr_2, ', '    , i.attr_3) AS item_attributes,
  (SELECT p.party_name
   FROM aaa.PARTIES    p
   WHERE i.user_id = 1) AS party_name
FROM (SELECT * FROM user_item WHERE deleted <> 1 ORDER BY item_id ASC) i LEFT JOIN users u ON i.user_id = u.user_id
WHERE u.user_id = 123 AND u.deleted <> 1
ORDER BY u.user_id DESC LIMIT 0, 1

;

整形してみました。

SELECT i.item_name,
       i.cnt AS item_count,
       i.craeted_at,
       CONCAT(i.attr_1, ', ', i.attr_2, ', ' , i.attr_3) AS item_attributes,

  (SELECT p.party_name
   FROM aaa.PARTIES p
   WHERE i.user_id = 1) AS party_name
FROM
  (SELECT *
   FROM user_item
   WHERE deleted <> 1
   ORDER BY item_id ASC) i
LEFT JOIN users u ON i.user_id = u.user_id
WHERE u.user_id = 123
  AND u.deleted <> 1
ORDER BY u.user_id DESC LIMIT 0,
                              1 ;
嬉しい
  • where句の式が AND(やOR)で縦に並ぶ。
  • その際、WHEREの5文字にあわせてインデントされる。
  • SQLが多少syntaxエラーでも整形してくれる(例えば、アプリケーションで使用しているSQLテンプレートは、SQLとしては正しいsyntaxになっていない場合もある。)
気になる
  • サブクエリのインデントが揃ってない。
  • サブクエリがメインクエリみたいに整形してくれない。
  • サブクエリの前に空行が入る。
  • LIMIT句のオフセットの後に改行が入る。
ちょっと気になる
  • ON句がJOIN句と一緒の行になる。
  • LIMIT句が ORDER句と一緒の行になる。
その他
  • 整形時にコメントを削除するstrip_commentsというオプションが設定にある。

ここまで書いて、最新の MySQL Workbench のSQL整形機能がすこぶる賢いみたいなことをOracleのセミナーで聞いたのを思い出しました。

*1:MACの場合

*2:普段MySQLオンリーなので標準SQLに疎く、変な構文を使っているかもしれません。syntaxとしては合ってると思います。