SQL で FizzBuzz (SQL Server 編)

中村 (id:taedium) さんが SQL Server をインストールしてくれたので (感謝!!),早速やってみました.
SQL Server の場合,WITH の後に RECURSIVE を付けなくても再帰問い合わせが出来るらしい.
っていうか,RECURSIVE とは書けないらしい.
ともあれ (JW),こうなりました.

with seq (n) as (
  select 1
  union all
  select n + 1 from seq where n < 100
)
select
  case
    when n % 15 = 0 then 'FizzBuzz'
    when n %  3 = 0 then 'Fizz'
    when n %  5 = 0 then 'Buzz'
    else cast(n as varchar)
  end
from
  seq
order by
  n

テーブルやビューを定義しなくていいからスッキリ書けますね♪
SQL Server とか標準 SQL再帰問い合わせは使ったことがなかったのだけど,なかなかいい感じ.
H2 でもサポートしてくれるとうれしいなぁ.
っていうか,Oracle でも.


ところで,いつも思うのだけど,UNION 使うとどうインデントしていいか悩ましい.
自分的には UNION は SELECT よりも上のレベルにしたいっていうか

  select 1
union all
  select n + 1 from seq where n < 100

ってしたい気分なんだけど,あまり評判よろしくないらしい.
どうするのがいいんだろ?


P.S.
よくよく考えたら Joe Celko 大先生の書籍

Joe Celko's SQL Programming Style (The Morgan Kaufmann Series in Data Management Systems)

Joe Celko's SQL Programming Style (The Morgan Kaufmann Series in Data Management Systems)

を持ってることを忘れてた (苦笑).
もちろん積んでましたとも,はい.
心より恥じる.


ともあれ (JW),Celko 大先生推奨のスタイルで上記の SQL を整形するとこうなるみたい.

WITH seq (n)
AS
(SELECT 1
  UNION ALL
 SELECT n + 1
   FROM seq
  WHERE n < 100)
SELECT CASE WHEN n % 15 = 0 THEN 'FizzBuzz'
            WHEN n %  3 = 0 THEN 'Fizz'
            WHEN n %  5 = 0 THEN 'Buzz'
            ELSE CAST(n AS VARCHAR) END
  FROM seq
 ORDER BY n

かなり微妙...
大文字・小文字はいいとしても (自分もマジメに書くときはこうしてる),このインデントは真似する気になれないなぁ.
うーみゅ...