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

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

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

2018年9月25日に作成されたページです。
情報が古かったり、僕が今以上のど素人だった頃の記事だったりする可能性があります。

結論から言えば、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)