[Looker]sqlパラメータでのcase句とcaseパラメータの違いを確かめてみる #looker

2021.05.06

さがらです。

早速ですが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で記述することで可読性を向上させたい時

参考URL