結論から言えば、IFやIFNULLはFROMでフツーに使えるゾ☆って話。
SELECT
β.name
FROM
α
LEFT JOIN β ON α.b_id = β.id
普通のJOIN。
βのid(往々にしてprimarykey)に0や空、NULLが登録されているわけでないなら、α.b_idに「値が無い」状態のときは取得できるnameがNULLになります。
IFNULL
SELECT
β.name
FROM
α
LEFT JOIN β ON IFNULL(α.b_id, 1) = β.id
IFNULL(expr1,expr2)
expr1 が NULL でない場合、IFNULL() は expr1 を返し、それ以外の場合は expr2 を返します。IFNULL() は、使用されているコンテキストに応じて、数値または文字列値を返します。
上記の場合、α.b_id=NULLの場合にβ.idは「1」とJOINします。
IF
SELECT
β.name
FROM
α
LEFT JOIN β ON IF(α.b_id, α.b_id, 1) = β.id
IF(expr1,expr2,expr3)
expr1 が TRUE (expr1 <> 0 および expr1 <> NULL) の場合、IF() は expr2 を返します。それ以外の場合は expr3 を返します。IF() は、使用されているコンテキストに応じて、数値または文字列値を返します。
上記の場合、α.b_idが0またはNULLの場合、と思いきや、IS TRUEでは文字列の場合、空文字も偽です。
0、空文字、NULLの場合に、β.idは「1」とJOINします。
CASE
SELECT
β.name
FROM
α
LEFT JOIN β ON CASE WHEN α.b_id !='' THEN α.b_id ELSE 1 END = β.id
アッ… まさかとは思ったけど、これもイケるんだ。
結論!
FROMはフツーに制御フロー関数が使える!
参考・引用元サイト:
【MySQL リファレンスマニュアル】12.4 制御フロー関数
【variable.jp】MYSQL (IF , IFNULL)
【たごもりすメモ】MySQLにおいて真とされる値を調べた