PostgreSQL/Metabase:如何创建变量实现多值ID与文本过滤
多值过滤实现方案
一、数字类型ID(如采购商品ID)过滤
如果需要匹配逗号分隔的多个数字ID(输入示例:1001,1003,1005),可根据使用的数据库选择对应写法:
PostgreSQL 写法
[[where "Product ID" in (select unnest(string_to_array({{product_ids}}, ',')))]]
string_to_array将输入的逗号分隔字符串转为数组,unnest把数组拆成单行数据,最终用IN匹配任一ID。
MySQL 写法
[[where FIND_IN_SET("Product ID", {{product_ids}}) > 0]]
FIND_IN_SET函数会检查ID是否在逗号分隔的字符串中,返回大于0的值即匹配成功。
二、文本类型变量(如用户名)过滤
如果需要匹配逗号分隔的多个用户名(支持模糊匹配,输入示例:张三,王经理),写法和数字ID有明显差异——需要对每个分割后的文本做模糊匹配:
PostgreSQL 写法(不区分大小写)
[[where exists ( select 1 from unnest(string_to_array({{user_names}}, ',')) as name_items where "User name" ~* concat('%', name_items, '%') )]]
这段代码会把输入的用户名拆分成单个条目,逐个检查用户名是否包含目标子串,只要有一个匹配就返回结果。~*表示不区分大小写的正则匹配,若需严格区分大小写,换成~即可。
通用模糊匹配写法(适配多数数据库)
如果输入的用户名数量固定,可直接用OR拼接多个LIKE条件,比如输入两个用户名时:
[[where "User name" like concat('%', {{name1}}, '%') or "User name" like concat('%', {{name2}}, '%')]]
核心差异说明
- 数字ID:以精确匹配为主,依赖数组拆分或
FIND_IN_SET实现多值匹配,无需额外拼接通配符。 - 文本变量:通常需模糊匹配,必须对每个分割后的文本拼接
%通配符,或用正则表达式实现多条件的OR逻辑。
内容的提问来源于stack exchange,提问作者Joehat
相关产品推荐
相关产品推荐

