2015年6月4日

PostgreSQLでFizzBuzzを書く

先日、久しぶりにネットでFizzBuzzネタを目にしたので、PostgreSQLでFizzBuzzする方法をご紹介しようと思います。

今回は小ネタエントリです。

■FizzBuzzとは


詳細はWikipediaを参照してください。 要は、1から100まで表示して、3で割り切れる時にFizz、5で割り切れる時にBuzz、3でも5でも割り切れる時にFizzBuzzと表示する、というプログラムを書くことです。

■1から100まで数字を表示する


まず、PostgreSQLで1から100までの数字を表示してみます。

PostgreSQLで連番を表示するには、generate_series()関数を使います。
snaga=> select * from generate_series(1,100);
 generate_series
-----------------
               1
               2
               3
               4
               5
               6
               7
(snip)
              95
              96
              97
              98
              99
             100
(100 rows)

snaga=>

■3で割り切れる値の時にFizzと表示する


次に、3で割り切れる数字の時にFizzと表示してみます。

そのためには、CASE WHEN構文を使います。
snaga=> select
snaga->        case when generate_series % 3 = 0 then 'Fizz'
snaga->                                          else generate_series::text end
snaga->   from generate_series(1,100);
 generate_series
-----------------
 1
 2
 Fizz
 4
 5
 Fizz
 7
 8
 Fizz
 10
(snip)
 Fizz
 97
 98
 Fizz
 100
(100 rows)

snaga=>

■5で割り切れる値の時にBuzzと表示する


次に、5で割り切れる数字の時にBuzzと表示します。
snaga=> select
       case when generate_series % 3 = 0 then 'Fizz'
            when generate_series % 5 = 0 then 'Buzz'
                                         else generate_series::text end
  from generate_series(1,100);
 generate_series
-----------------
 1
 2
 Fizz
 4
 Buzz
 Fizz
 7
 8
 Fizz
 Buzz
(snip)
 Fizz
 97
 98
 Fizz
 Buzz
(100 rows)

snaga=>

■3でも5でも割り切れる値の時にFizzBuzzと表示する


最後に、3でも5でも割り切れる値の時に、FizzBuzzと表示してみます。

優先度としてもっとも高いので、CASE文の最初の条件分岐に持ってきます。
snaga=> select
snaga->        case when generate_series % 3 = 0 and generate_series % 5 = 0 then 'FizzBuzz'
snaga->             when generate_series % 3 = 0 then 'Fizz'
snaga->             when generate_series % 5 = 0 then 'Buzz'
snaga->                                          else generate_series::text end
snaga->   from generate_series(1,100);
 generate_series
-----------------
 1
 2
 Fizz
 4
 Buzz
 Fizz
 7
 8
 Fizz
 Buzz
 11
 Fizz
 13
 14
 FizzBuzz
 16
 17
 Fizz
 19
 Buzz
(snip)
 FizzBuzz
 91
 92
 Fizz
 94
 Buzz
 Fizz
 97
 98
 Fizz
 Buzz
(100 rows)

snaga=>

■まとめ


というわけで、PostgreSQLであっても、世間で言われているFizzBuzzを実現することができることをお伝えしました。

ぜひ、面談などで「FizzBuzz書ける?」と質問された場合には、「それ、PostgreSQLでも書けますよ!」とアピールしていただければと思います。

では。

0 件のコメント:

コメントを投稿