まずは蝋の翼から。

学んだことを書きながら確認・整理するためのメモブログ。こういうことなのかな?といったことをふわっと書いたりしていますが、理解が浅いゆえに的はずれなことも多々あると思うのでツッコミ歓迎

TabeauのカスタムSQLにカンマ区切りで複数値をパラメータに入れてデータ抽出をする

表題通り。TabeauのカスタムSQLにカンマ区切りで複数値をパラメータに入れてデータ抽出をする。

概要

カスタムSQLでパラメータに「1231, 132, 3124」のように','区切りで文字列を入れて

SELECT * FROM user_table WHERE user_id IN (1231, 132, 3124)

的なことがしたい。
が、普通にやるとエラーになるっぽい。 それをある程度なんとかした話。

そもそもカスタムSQLにパラメータを使うとは

TableauはデータソースとしてSQLを発行してその結果をデータソースとして使用できる(カスタムSQL
その際にSQL上にTableauのパラメータという変数機能を用いることで動的にデータソースを変えることができる。
イメージ的には、カスタムSQL

SELECT * FROM [パラメータ]

として、[パラメータ]にtb1を指定するとtb1からデータ抽出、tb2を指定するとtb2からデータ抽出がされる。

普通にパラメータに複数値を文字列で入れる

SELECT * FROM user_table WHERE user_id IN ( [パラメータ] )

でパラメータに文字列で「1231, 132, 3124」と入れると

SELECT * FROM user_table WHERE user_id IN (1231, 132, 3124)

ならなかった
何も抽出されねぇ。

ならなかった理由

パラメータを文字列にしているので

SELECT * FROM user_table WHERE user_id IN ( '1231, 132, 3124' )

のように認識されているっぽい。
つまり、 user_id = '1231, 132, 3124' で判定している。
パラメータを「1231」のように1つだけのときは想定通りuser_idが1231のものがちゃんと抽出されたことからもそうっぽい。

対策

「Tableau カスタムSQL パラメータ 複数」でググったがそれっぽいのが出ない。
しゃーなしそのまま英語で「tableau custom sql parameter multiple」としたらTableauコミュニティの投稿(英語)がいくつか引っかかった。 色々あったがちゃんと答えられているのは
https://community.tableau.com/thread/193895
で使われているものくらいか? (同様の回答は他の同内容スレッドでもあった) というわけで実際に使ってみる。

f:id:chito_ng:20180331174124p:plain

↓↓↓↓↓↓↓

f:id:chito_ng:20180331174343p:plain

ふむ。できた。
要するにパラメータ文字列を固定値として、user_idの各値を使った前後方正規表現検索にあてはまったものを表示することで実装。
今回の場合は、

' G3869,C27250 ' LIKE '%[各user_id]%'

となり、例えばuser_id = G3869は

' G3869,C27250 ' LIKE '%G3869%'

で引っかかるので抽出できる。

ただし、データによっては挙動が想定通りいかない

G3869,C27250

G38696,C27250

にしてみる。

f:id:chito_ng:20180331175002p:plain

G38696,C27250以外にも、呼んでないのにG3869が出てきた。 まぁ理屈から考えたら

' G38696,C27250 ' LIKE '%G3869%'

はTrueなのでそうなるわな。
対策や他の方法も調べたが他に方法なさそうだなー。
そもそも論で言えば、user_idとかは固定幅の設定にしておいてG3869はG03869とかにしろよって感じだが。。。  

というわけで

' ,G38696,C27250, ' LIKE '%,G3869,%'

というようにすることで、前後に ' , ' を入れて部分一致してしまうものを弾けるようにする。
正規表現部分だけ ' , ' をいれてしまうと固定値のパラメータ部分の1番目の指定したuser_idが
'G38696' '≠ %,G3869,%' のようになるので、パラメータの前方にも ' , ' を入れる 。 (最後の指定したuser_id部分も同様の理由より' , ' を後方に入れる)

f:id:chito_ng:20180331182213p:plain

↓↓↓↓↓↓↓

f:id:chito_ng:20180331174343p:plain

完成。