ど素人から毛を生やす。<延>

[MySQL]JOIN対象のセルが空の場合は指定の値でJOINしたい。

Web > Other 2018年9月25日(最終更新:24日前)

結論から言えば、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において真とされる値を調べた

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)