【MySQL】ビットフラグで格納されている値を、マスタテーブルで定義された日本語名に変換して出力するSQL

【MySQL】ビットフラグで格納されている値を、マスタテーブルで定義された日本語名に変換して出力するSQL

使っていた敏感肌用シャンプーが合わなくなってきたので、とうとう固形石鹸で頭を洗い始めました。こんにちは。fukasawaです。 髪はきしむけれど頭皮の状態はなんとなく安定です。乾燥する季節も終わったので、しばらくはこれでいいかも。

さて、現在関わっているプロジェクトでは、DB上にビットフラグを利用しているカラムがあります。正直あまり得意では無いのですが、古くからあるテーブルに定義されているものなので、なんとか頑張って付き合っています。

今回は「ビットフラグで格納されている値を、マスタテーブルで定義されてた日本語名に変換して出力する」SQLの書き方についてです。どのくらい需要があるのかは謎ですが。

SQLについて

サンプルテーブルです。動物マスタテーブルと、飼い主&飼っているペットが格納されているテーブルの2つを用意しました。(サンプル.sql)

20190427_fukasawa_2.PNG

↑このふたつのテーブルを結合して↓こう出力します。owners.petsの値が、動物マスタで定義した日本語名(カンマ区切り)に変換されて出力されています。

20190427_fukasawa_1.PNG

発行したSQLはこんな感じです。

select
     o.id
     , o.name
     , o.pets
     , group_concat(ma.name order by ma.bit_pos asc SEPARATOR '、') AS pet_list
   from owners o left join mst_animals ma
     on o.pets & ma.bit_pos group by o.id;

ざっくり解説していきます。

使われている関数について

過去記事に同じようなSQLの紹介記事を書いていて、そちらに簡単な説明を書いているので、必要に応じて参照してみてください。

SQLの動作について

まずは、group by を 外した状態で見てみます。

select
    o.id    AS o_id,
    o.name  AS o_name,
    o.pets  AS o_pets,
    ma.bit_pos AS ma_bit_pos,
    ma.name AS ma_name
  from owners o left join mst_animals ma
     on o.pets & ma.bit_pos order by o.id, ma.bit_pos;

出力結果はこんな感じです。

20190427_fukasawa_3.PNG

この結果をgroup byで飼い主ごとにまとめたのが最初のSQLです。ペットの種類はGROUP_CONCATで結合します。 (GROUP_CONCATで結合する際「order by ma.bit_pos 」をつけないと、バラバラの順番で結合されてしまうようです。)

20190427_fukasawa_1.PNG

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ