教程:SQL 问题的字段过滤器
了解如何使用 Metabase 字段过滤器在 SQL 查询中构建更智能的过滤器控件。
正在寻找关于字段过滤器的文档?请参阅 文档:字段过滤器。
本文介绍如何使用一种称为字段过滤器的特殊变量类型,为 Metabase 中的 SQL 查询添加智能 SQL 过滤器控件。
字段过滤器简介

对于用 SQL 编写的 Metabase 问题,我们可以使用基本变量类型——文本、数字和日期——来创建简单的 SQL 过滤器控件。要创建“更智能”的过滤器控件,它可以显示特定于过滤列中数据的选项,例如创建下拉菜单,我们可以使用一种称为字段过滤器的特殊变量类型。

字段过滤器一开始可能会让一些人感到困惑,因为人们期望它们的行为方式与基本输入变量(它们不是)相同。然而,字段过滤器非常值得学习,因为你可以用它们来创建更复杂的过滤器控件。本文将深入介绍字段过滤器,但首先让我们讨论字段过滤器变量与基本文本、数字和日期变量之间的主要区别。
区分字段过滤器和简单的文本、数字和日期变量
- 字段过滤器默认是可选的。 如果没有提供值,SQL 查询将像字段过滤器不存在一样运行。但是,你可以选择要求提供值。
- 字段过滤器使用特殊的语法,以便它们可以在后台处理 SQL 代码。 你只需在
WHERE子句中提供字段过滤器(不带列或运算符),字段过滤器将为你管理 SQL 代码。这使得代码能够考虑到用户在过滤器控件中所做的多个选择。
第二点尤其容易引起混淆,让我们通过一个例子来详细说明。
使用下拉菜单创建 SQL 过滤器控件
我们将使用 Metabase 随附的示例数据库,为用 SQL 编写的问题添加一个带有下拉菜单的过滤器控件。假设我们要创建一个 SQL 问题,该问题从 Orders 表中获取所有订单,但我们希望用户可以选择按 Products 表中的类别进行筛选。我们可以创建一个 Products.category 过滤器,并使用基本输入变量,如下所示:
SELECT *
FROM Orders
LEFT JOIN Products
ON Orders.product_id = Products.id
[[WHERE Products.category = {{category}}]];
在这种情况下,我们将 WHERE 子句括在双括号中以使输入可选,并使用变量侧边栏将变量类型设置为 Text,将过滤器控件标签设置为 Category。这种方法可行,但并非最佳。
- 为了筛选数据,人们必须知道存在哪些类别(并在输入时正确拼写)。
- 此外,他们不能一次选择多个类别,因为
{{category}}变量只接受单个值。
相比之下,字段过滤器会将变量映射到实际的列数据。连接到变量的过滤器控件然后“知道”哪些类别可用,并可以呈现这些类别的下拉菜单,如下所示:

关于控件的一点说明:下拉菜单只是可用选项之一。对于Category类型的字段,例如我们Products表中的category字段,我们还可以将过滤器控件设置为搜索框或普通输入框。管理员可以在管理员面板的数据模型选项卡中配置字段设置。

请注意,如果列中的不同值数量大于 300,Metabase 将自动使用搜索框,即使你选择了下拉选项。在我们的文档中了解有关编辑元数据的更多信息。
现在,让我们回到我们的问题。这是 Products.category 字段过滤器的语法。请注意,在 WHERE 子句中省略了变量前面的列和运算符——我们将在下面详细讨论字段过滤器语法。
SELECT *
FROM orders
LEFT JOIN products
ON orders.product_id = products.id
WHERE {{category}};
将变量放在 WHERE 子句中后,我们可以使用变量侧边栏将我们的变量设置为字段过滤器。我们将设置:
变量类型为Field Filter。要映射的字段为Products → Category。此设置告诉 Metabase 将 SQL 代码中的变量连接到Products表的category列。字段控件类型为category。字段控件标签为category。

我们不会要求提供变量,因此不需要默认值。如果查询在过滤器控件中没有指定值而运行,查询将返回所有类别的记录。
请注意,WHERE 子句未指定变量应等于哪个列。这种隐式语法(隐藏的 SQL 代码)允许字段过滤器在后台处理 SQL 代码以适应多个选择。
为日期字段创建复杂的 SQL 过滤器控件
我们可以创建一个基本输入变量(日期类型),这将添加一个带有简单日期过滤器的 SQL 过滤器控件。相反,如果我们使用字段过滤器变量,我们可以将其连接到包含日期的字段(列),这为配置我们的过滤器控件解锁了更多选项。这是 SQL:
SELECT *
FROM ORDERS
WHERE {{created_at}}

以下是映射到日期字段的字段过滤器的不同控件类型:
- 月和年
- 季度和年
- 单日期
- 日期范围
- 相对日期
- 日期过滤器
每种控件类型都提供了不同的方式供人们筛选结果。以下是三个 SQL 字段过滤器示例:



日期过滤器控件类型提供了最大的灵活性,允许人们按相对日期和范围进行筛选。
字段过滤器注意事项
人们在尝试实现字段过滤器时,通常会在以下几个地方卡住。
在 WHERE 子句中省略直接赋值
如上所述,字段过滤器周围的 SQL 代码不完全符合规范。你可能会想写:
-- DON'T DO THIS
WHERE category = {{ category }}
因为这对于标准 SQL 中的 WHERE 子句来说是正确的语法。但这种语法不适用于字段过滤器。字段过滤器的正确语法省略了 = 运算符:
WHERE {{ category }}
这种简写的原因是为了让 Metabase 可以在后台插入 SQL 代码来处理多选等情况,例如当用户从下拉列表中选择多个类别时。
了解有关 SQL 过滤器和变量的更多信息
查看我们的基本 SQL 输入变量——文本、数字和日期指南。
你还可以阅读我们的关于以下内容的文档: