hirapi's blog

ちゃんとしたふりをする

redashの入力フォームで「特定の値 -> 無指定」として扱いたいときのSQL

redash.io

こんなテーブルがあったとして、

mysql> SELECT * FROM users;
+----+-----------+------+----------+
| id | name      | age  | group_id |
+----+-----------+------+----------+
|  1 | hirapi    |   25 |        1 |
|  2 | someone   |  100 |        1 |
|  3 | young man |    6 |        2 |
+----+-----------+------+----------+

redashの入力フォームに「対象グループID」を入力して、そのグループの人の名前を取ってきたいとする。 redashは {{フォーム名}} で入力値を取れるので、普通に書くと

SELECT name FROM users WHERE group_id = {{対象グループID}}

となる。

ここで、例えば「グループ関係無くみんなの名前も取れるようにしたい、クエリは分けたくない」みたいなこと言われたら、 「入力フォームに 0 を入れたらグループ無指定ということで全員の名前を取ってくる」というのはどうだろうということになる。

pythonでif文はさんでクエリ作るのもアリといえばアリだけど面倒くさいなあと思った結果↓↓

SELECT name FROM users WHERE {{対象グループID}} = 0 OR group_id = {{対象グループID}}

対象グループID が0だったら

mysql> SELECT name FROM users WHERE 0 = 0 OR group_id = 0;
+-----------+
| name      |
+-----------+
| hirapi    |
| someone   |
| young man |
+-----------+

対象グループID が1だったら

mysql> SELECT name FROM users WHERE 1 = 0 OR group_id = 1;
+---------+
| name    |
+---------+
| hirapi  |
| someone |
+---------+

クエリチューニングの面から見たら良くないかもしれないけどさくっと作れたし今回はおっけー。
別にredashに限った話ではないけど入力値をそのままクエリに突っ込むのがredashくらいしかなかった。