Help us understand the problem. What is going on with this article?

metabaseでのWHERE変数の組み方メモ

metabaseとは

OSSのWEBベースBIツールです。以下のQiitaが詳しい
https://qiita.com/acro5piano/items/0920550d297651b04387

特に気に入っているのがdockerでの利用が超かんたんな所。
適当なRDBと一緒にyamlを書いてcomposeを立ちあげれば、すぐに分析に使えます。

docker-composeのサンプル

なお、よくあるサンプルではmetabase.dbをvolume指定していないので、コンテナを再作成すると作った分析データが消えます。
Volume指定だいじ。

docker-compose.yml
version: '3'
services:
  metabase:
    image: metabase/metabase
    volumes:
      - ./metabase-data:/metabase-data
    environment:
      MB_DB_FILE: /metabase-data/metabase.db
    ports:
      - "3000:3000"
    links:
      - db
  db:
    image: mysql:5.6.26
    environment:
      MYSQL_ROOT_PASSWORD: ****
      MYSQL_DATABASE: mydb
      MYSQL_USER: user
      MYSQL_PASSWORD: ***
      TZ: 'Asia/Tokyo'
    volumes:
      - ./db:/var/lib/mysql
      - ./mysql_conf:/etc/mysql/conf.d
    ports:
      - 3306:3306
volumes:
  db:
  metabase:

便利なSQLでの定義作成

metabaseはSQLでガシガシ条件を書いて、定義(分析)を公開することができるので、土方社内SEにもおすすめです。
ただし、使い込みの情報があまり国内になく、stackoverflowやgithubのissueからノウハウを拾って作らなければいけないケースが、結構あります。

詳しい使い方は以下の公式が詳しい。
https://www.metabase.com/docs/latest/users-guide/writing-sql.html

この文書では、この中に記載があるもの、無いものの中から使いたいケースがあったものを記載します。

変数

SQLで問い合わせを書いた場合に、変数が使える。
公式のヘルプもあるが、『こういう時どうすればいいんだ?』という事が結構記載がなかったりする。海外のフォーラムなどで解が得られたものをメモしていく。随時追記する。

2020-02-18:取り急ぎなんとかしたかったLIKEとINがわかったので、下書きから公開にします。

参考ページ

https://www.metabase.com/docs/latest/users-guide/13-sql-parameters.html

基本構文

metabaseの変数は基本的に以下のルールで構成される。
1. {} で囲むと変数になる。
- 変数は半角英数で命名する。
- フィルターラベルを指定すると入力枠に名称が表示される。
- 必須の制御は変数設定メニュー
- デフォルト値は事前に決めた固定しか登録できない
2. [[]]で囲むと、囲まれた範囲内の変数が入力されたときのみ、その中の構文が評価される。

デフォルト値の設定

参考:https://www.metabase.com/docs/latest/users-guide/13-sql-parameters.html

metabaseの変数設定エリアにも初期値を指定できるが、今日の日付などといった動的な値は設定できない。
metabaseの説明によれば、値を入力した時だけ、初期値がコメントアウトされるように記入すればよいとのこと。

WHERE createdAt = [[ {{dateOfCreation}} -- ]]CURRENT_DATE()

このSQLで記載し、該当の項目に何も入力しないと以下のクエリとして評価される。

WHERE createdAt = CURRENT_DATE()

何か入力するとこの様になる。

WHERE createdAt = '2020-02-01 00:00:00' -- CURRENT_DATE()

ちょっとHackっぽいが、結果が取れればよい。というスタンスのようだ

LIKE の書き方

LIKEで文字列を検索したい場合は以下のように記載するとよい。
ダブルクォーテーションでくくるとうまいことやっくれるようだ。

name LIKE "%"{{name}}"%"

また、比較対象の文字列に%を含めればよいのであれば、以下のような書き方でもOK
もちろんCONCAT以外でも各RDBの文字結合ができる書き方なら通る

name LIKE CONCAT('%',{{name}},'%')

IN の書き方

v0.25 から 数値タイプ のみIN句がNativeSupportされています。

/* 値タイプを数値にする */
id IN ({{id}})

それ以外の型はまだIssueがCloseされておらず、以下のような形での回避が提示されています。
https://github.com/metabase/metabase/issues/4728

/* mysql */
select count(*) from T
where find_in_set(day, {{day}}) <> 0;

/* postgresql */
select count(*) from T
where day = ANY (string_to_array({{day}},  ','));
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした