[Looker]sqlパラメータでのcase句とcaseパラメータの違いを確かめてみる #looker
さがらです。
早速ですがLookerでは各フィールドの定義時、対象となるカラムの値に応じて表示するlabel等の内容を変更するcase
パラメータが存在します。
しかし、Lookerではsql
パラメータの中にSQLを記述することが出来ますので、この中にCASE句を記述することも出来てしまいます。
この違いはどんなところにあるのか、本エントリでまとめてみます。
どこに違いが出るのか?
最初にどこに違いが出るのかを説明しておくと、「sql
パラメータでCASE句を使う場合」と「case
パラメータを使う場合」では、以下2つの場合で違いが出てきます。
- Exploreで選択したときの表示順序
- Exploreでフィルターとして設定したとき
これらの違いについて、以下に詳細にまとめてみます。
Exploreで選択したときの表示順序
sql
パラメータでCASE句を使う場合
sql
パラメータでCASE句を使う場合、表示順序はsqlパラメータの記述順に関係なく、アルファベット順にソートされます。
dimension: case_sql_ver { sql: CASE WHEN ${order_id} = 2 THEN 'B:idは2です' WHEN ${id} = 1 THEN 'A:idは1です' ELSE 'C:idはその他の値です' END ;; }
case
パラメータを使う場合
case
パラメータを使う場合、表示順序はcaseパラメータ内で記述した順番に応じてソートされます。
dimension: case_parameter_ver { case: { when: { sql: ${id} = 2 ;; label: "B:idは2です" } when: { sql: ${id} = 1 ;; label: "A:idは1です" } else: "C:idはその他の値です" } }
一方で、alpha_sort: yes
と対象のdimensionパラメータ内でオプションを追記すると、caseパラメータ内で記述した順番に関係なく、アルファベット順でソートされます。
dimension: case_parameter_ver { alpha_sort: yes case: { when: { sql: ${id} = 2 ;; label: "B:idは2です" } when: { sql: ${id} = 1 ;; label: "A:idは1です" } else: "C:idはその他の値です" } }
Exploreでフィルターとして設定したとき
sql
パラメータでCASE句を使う場合
通常のdimensionのフィルターと同じように使用できます。
case
パラメータを使う場合
使用できるフィルタの種類が下図のように、通常のdimensionと異なるものになります。
1つの値だけ選択する場合には問題ないのですが、複数の値を同時に選択したい場合は下図のように「matches (advanced):高度なフィルタ」を使用しなければいけません。それぞれの値をカンマ区切りで直接記入しないといけないのが辛いですね…
使い分けの考え方
sql
パラメータでCASE句を使う場合
- Exploreの用途として、複数の値を同時に選択することが多い時
case
パラメータを使う場合
- Exploreでの選択時、表示する順番を自分で定めたい時
- LookMLで記述することで可読性を向上させたい時