SQLのダミーテーブルでFizzBuzz


SQLで既存テーブルや一時テーブルを使わずにFizzBuzzします。

会社のDBでもその場ですぐに試せるはずです。DB管理者にビンタされないようテスト環境でこっそりとお楽しみください。

FizzBuzzの判定を結合時に行っている所が素敵ポイントです。

select
  case when s.e is null then t.c else s.e end as z
from (
  select a * 10 + b + 1 as c from (
    select 0 as a union
    select 1 union select 2 union select 3 union
    select 4 union select 5 union select 6 union
    select 7 union select 8 union select 9 ) as x
  join (
    select 0 as b union
    select 1 union select 2 union select 3 union
    select 4 union select 5 union select 6 union
    select 7 union select 8 union select 9 ) as y
) as t join (
  select 0 as d,  null as e union
  select 1     , 'Fizz'     union
  select 2     , 'Buzz'     union
  select 3     , 'FizzBuzz'
) as s
where s.d = (t.c % 3 = 0) + (t.c % 5 = 0) * 2
order by t.c;

SQLite向けに書かれていますが、MySQL等のメジャーDBでも動くと思います。

ORACLEの場合はDUAL表を用いる必要があります(select X unionの部分をselect N from dual unionにする)。

PostgreSQLの場合はjoin,に置き換え、(t.c % N = 0)cast(t.c % N = 0 as int)に書き換えれば動きます。

またDBによってはthen t.cの結果を文字列型に統一する必要があります(then t.c || '' or cast(t.c as char))。

ワンライナー

MySQLであれば、以下の方法でワンライナー出来るはずです。

mysql -uroot -e "select case when s.e is null then t.c else s.e end as z from ( select a * 10 + b + 1 as c from ( select 0 as a union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 ) as x join ( select 0 as b union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 ) as y ) as t join ( select 0 as d,  null as e union select 1, 'Fizz'union select 2, 'Buzz' union select 3, 'FizzBuzz' ) as s where s.d = (t.c % 3 = 0) + (t.c % 5 = 0) * 2 order by t.c;"

広告

関連するオススメの記事