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;"