MySQLには、引数のうち最も大きい値を返してくれるという便利な関数がある。
便利ではあるが、nullが含まれていた場合、nullが返されるというクソ仕様となっている。
select
greatest(20, 10, 5, 30)
;
30が返ってくる。
しかし、↓の場合は
select
greatest(20, null, 5, 30)
;
nullが返ってきてしまう。。。
なので、nullを比較対象外にするために、nullの場合は最小値となるようにしておけば良い。
select
greatest(ifnull(20, 0), ifnull(null, 0), ifnull(5, 0), ifnull(30, 0))
;
greatestは最大値を返してくれるが、逆に最小値を返してくれるleastという関数も存在する。
そのleastもnullが存在すると、nullを返してくる。
なので、同じように、nullの場合は最大値となるようにしておけば良い。
select
least(ifnull(20, 100), ifnull(null, 100), ifnull(5, 100), ifnull(30, 100))
;