字段筛选器
字段过滤器是您可以直接连接到数据库字段的特殊变量。
何时使用字段过滤器变量,何时使用基本变量
通常情况下,优先使用字段过滤器变量。它们提供具有下拉菜单和动态日期选择器的“智能”过滤器小部件。
但是,如果您的查询中缺少用于连接过滤器的数据库字段,那么您需要改用基本变量。例如,如果您想按自定义列进行筛选,则需要使用基本变量。
字段过滤器变量
添加字段过滤器
字段过滤器语法
假设您想创建一个字段过滤器变量,用于按state字段筛选People表。
这是字段过滤器的语法
SELECT
*
FROM
PEOPLE
WHERE
{{state}}
注意缺少列和运算符(它不是WHERE state = {{state}},而是WHERE {{state}})。您需要以这种方式构造字段过滤器变量,以便处理 Metabase 为您生成代码的情况。例如,对于处理用户在过滤器小部件中选择多个值或日期范围的情况,Metabase 将必须内插 SQL 代码以处理这些输入到变量中。
在 MongoDB 原生查询中,您需要将字段过滤器放入$match子句中。
[ {$match: {{date_var}} } ]
将字段过滤器连接到数据库字段
为了使字段过滤器变量正常工作,您需要将变量与数据库字段关联起来。
- 转到侧边栏的变量和参数。
- 在变量类型下,选择“字段过滤器”变量类型。
- 选择要将哪个字段映射到您的变量(在本例中,我们将产品表中的
Category字段映射到此变量)。
您只能将字段过滤器映射到数据库字段。如果您无法使用字段过滤器,可以回退到使用基本变量。
指定表和字段别名
如果将过滤器映射到别名表的字段,您需要将该别名告知 Metabase,否则过滤器将不起作用。
例如,假设您想将字段过滤器映射到products表中的category字段,但在查询中,您对products表使用了别名p,如下所示:
SELECT
*
FROM
products AS p
WHERE
{{category_filter}}
如果您映射到产品表中的category字段,您还需要填写表和字段别名输入框,让 Metabase 知道该别名。在这种情况下,您输入p.category。
只有当您的查询使用别名来引用包含您要映射过滤器的字段的表时,才需要设置此表和字段别名。
这是另一个示例,这次是使用 CTE
WITH
expensive_products AS (
SELECT
*
FROM
products
WHERE
price > 50
)
SELECT
*
FROM
expensive_products
WHERE
{{category_filter}}
在这里,我们再次将字段过滤器映射到products表中的category字段。但由于我们使用了别名为expensive_products的 CTE,我们在表和字段别名输入框中输入expensive_products.category才能使映射正常工作。
字段过滤器必须连接到查询中包含的数据库字段
您的主查询应了解字段过滤器变量指向的所有表,否则您将收到 SQL 语法错误。例如,假设您的主查询包含如下字段过滤器:
SELECT
*
FROM
ORDERS
WHERE
{{ product_category }}
假设{{ product_category }}变量引用了使用Products表的另一个问题。为了使字段过滤器正常工作,您需要在主查询中包含一个到Products的连接。
SELECT
*
FROM
ORDERS
JOIN PRODUCTS ON ORDERS.product_id = PRODUCTS.id
WHERE
{{ product_category }}
如果您无法使用字段过滤器,则可以改用基本变量。
BigQuery 和 Oracle 中的字段过滤器
确保您的 SQL 方言与您选择的数据库匹配。关于查询中表引用的常见问题
| 数据库 | 方言怪癖 | 示例 |
|---|---|---|
| BigQuery | 模式和表必须用反引号引用。 | FROM `dataset.table` |
| Oracle | 模式和表必须用双引号引用。 | FROM "schema.table" |
如需更多帮助,请参阅SQL 错误消息故障排除。
使字段过滤器成为可选
请参阅可选变量。
阅读其他版本的 Metabase 的文档。