pp sql

niceqlがなかなか便利だーと思ったのだけど、少し使ってみていると表示にちょっと不満が出てきた。

他にないかなとさがしてみるとanbt-sql-formatterというのがあった。↑の不満はとりあえずどうにかなりそうなのだが、残念なことにカラー表示には対応していなかった。

というわけで、ちょっとでっちあげてみた → https://gist.github.com/arika/762aa661c62779f7a7761e6c4e2eb63f

SQL文が

SELECT `users`.* FROM `users` INNER JOIN `comments` ON `comments`.`user_id` = `users`.`id` INNER JOIN `articles` ON `articles`.`id` = `users`.`user_id` AND `articles`.`status` NOT IN (0, 9)
WHERE `users`.id  10 LIMIT 3

なら、出力は

SELECT
        `users`. *
    FROM
        `users`
    INNER JOIN
        `comments`
        ON `comments`.`user_id` = `users`.`id`
    INNER JOIN
        `articles`
        ON `articles`.`id` = `users`.`user_id`
        AND `articles`.`status` NOT IN (
            0
            ,9
        )
    WHERE
        `users`.id  10 LIMIT 3

となる。このくらいなら悪くなさそう。

でも、もうちょっと複雑になると………

SELECT
        a
        ,b
        ,SUM (c)
    FROM
        (
            SELECT
                    d
                    ,e
                    ,f
                FROM
                    (
                        SELECT
                                g
                                ,h
                                ,i
                            FROM
                                TABLE
                                WHERE
                                    id IN (
                                        1
                                        ,2
                                        ,3
                                    )
                    ) a
                WHERE
                    a.e = 5
                    OR a.e = 7
        ) b
    WHERE
        b.c > 5
    GROUP BY
        a
        ,b
    ORDER BY
        a ASC
        ,b DESC

ちょっとやりすぎに感じる。文法的に整形するのとppとはちょっと違うのだなと思った。

もともとのppのように一行の文字数を制限して、その中に収まる部分は一行で表示してしまう、とかするとよいのかもしれない。sqlppあたりに手を加えるともう少しなんとかなりそうなのだけど。

ちなみにniceqlの出力はそれぞれ

SELECT `users`.*
  FROM `users`
  INNER JOIN `comments` ON `comments`.`user_id` = `users`.`id`
  INNER JOIN `articles` ON `articles`.`id` = `users`.`user_id` AND `articles`.`status` NOT IN (0, 9)
  WHERE `users`.id  10
  LIMIT 3

SELECT a, b, sum(c)
  FROM (
    SELECT d, e, f
    FROM (
      SELECT g, h, i
      FROM table
      WHERE id IN (1, 2, 3)
    ) a
    WHERE a.e = 5 OR a.e = 7
  ) b
  WHERE b.c > 5
  GROUP BY a, b
  ORDER BY a ASC, b DESC

のようになる。