字段筛选器
字段筛选器是可以直接连接到数据库字段的特殊变量。
何时使用字段筛选器变量与基本变量
总的来说,优先使用字段筛选器变量。它们提供带有下拉菜单和动态日期选择器的“智能”筛选小组件。
然而,如果您的查询缺少可供筛选器连接的数据库字段,则需要使用基本变量。例如,如果您想按您创建的自定义列进行筛选,则需要使用基本变量。
字段筛选器变量
如何添加字段筛选器
字段筛选器语法
假设您想创建一个字段筛选器变量,用于按 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 的文档。