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
- 出版社/メーカー: Morgan Kaufmann
- 発売日: 2005/05/01
- メディア: ペーパーバック
- この商品を含むブログ (1件) を見る
もちろん積んでましたとも,はい.
心より恥じる.
ともあれ (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
かなり微妙...
大文字・小文字はいいとしても (自分もマジメに書くときはこうしてる),このインデントは真似する気になれないなぁ.
うーみゅ...