Since I’ve been messing with the FizzBuzz problem recently, I started digging. First I looked at Excel, but I run Excel 2015 and Excel started supporting CONCAT in 2016. I could (and might later) try this in Google Sheets, but I decided to aim elsewhere.

MySQL

The first problem is RANGE(), or specifically, the lack of it. I don’t want to create a numbers table just to allow me to get the numbers from 1 to 20, so, the solution:

SELECT * FROM (
        SELECT 1 i
        UNION SELECT 2
        UNION SELECT 3
        UNION SELECT 4
        UNION SELECT 5
        UNION SELECT 6
        UNION SELECT 7
        UNION SELECT 8
        UNION SELECT 9
        UNION SELECT 10
        UNION SELECT 11
        UNION SELECT 12
        UNION SELECT 13
        UNION SELECT 14
        UNION SELECT 15
        UNION SELECT 16
        UNION SELECT 17
        UNION SELECT 18
        UNION SELECT 19
        UNION SELECT 20
    ) A;

And from here, we have three “tricks” to get us from here to total FizzBuzz, and you know them, but perhaps not within SQL.

MOD()

We’re gonna use the same FROM from here on out. MOD() is modulus, and SELECT i, MOD(i,3) m gives us

i	m
1	1
2	2
3	0
4	1
5	2
6	0
7	1
8	2
9	0
10	1
11	2
12	0
13	1
14	2
15	0
16	1
17	2
18	0
19	1
20	2

From here, we go to …

IF()

Specifically, we go to SELECT IF(MOD(i, 3) < 1, 'fizz', '')

IF(MOD(i, 3) < 1, 'fizz', '')


fizz


fizz


fizz


fizz


fizz


fizz



This is a good start, but here, we’re dealing with all those empty rows. Do not want, so we go to the previously mentioned…

CONCAT()

Concatentation takes several lines and joins it to one line. Like this:

CONCAT(
        IF(MOD(i, 3) < 1, 'fizz', ''),
        IF(MOD(i, 5) < 1, 'buzz', ''),
        IF(
            MOD(i, 3) >= 1 AND
            MOD(i, 5) >= 1, i, ''
        )
    )

Resulting in:

1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
17
fizz
19
buzz

If you have any questions or comments, I would be glad to hear it. Ask me on Twitter or make an issue on my blog repo.