Looker视图Filter中使用CASE语句实现人名映射学院过滤的问题
Looker过滤器按输入人名匹配对应学院的修复方案
问题根源
你原来的代码逻辑完全搞反了判断对象:
你写的WHEN ${TABLE}.house LIKE '%harry%'是判断数据库中存储学院名的house字段是否包含harry字符串,但你的house字段实际存储的是gryffindor/ravenclaw这类学院名,永远不会命中人名匹配的条件,所有行都会走到ELSE分支的${TABLE}.house = ${TABLE}.house(恒真条件),所以WHERE条件整体永远成立,返回全量数据。
修复方案
你需要在CASE判断中引用用户在过滤器输入的内容,Looker的filter块内部可以直接用{{ value }}指代当前过滤器的用户输入值,修改后的LookML代码如下:
filter: house { type: string sql: CASE WHEN LOWER({{ value }}) LIKE '%harry%' THEN ${TABLE}.house = 'gryffindor' WHEN LOWER({{ value }}) LIKE '%luna%' THEN ${TABLE}.house = 'ravenclaw' WHEN LOWER({{ value }}) LIKE '%ernie%' THEN ${TABLE}.house = 'hufflepuff' WHEN LOWER({{ value }}) LIKE '%draco%' THEN ${TABLE}.house = 'slytherin' ELSE ${TABLE}.house = ${TABLE}.house END ;; }
加LOWER()是为了兼容大小写输入,用户输入Harry/harry都能正常匹配。
效果验证
当用户在过滤器输入harry时,生成的SQL WHERE条件会等价于hogwarts.house = 'gryffindor',仅返回格兰芬多的对应数据,符合预期。
内容的提问来源于stack exchange,提问作者nb_nb_nb
相关产品推荐
相关产品推荐

