教程:SQL 问题的字段过滤器

了解如何使用 Metabase 字段过滤器在 SQL 查询中构建更智能的过滤器控件。

正在寻找关于字段过滤器的文档?请参阅 文档:字段过滤器

本文介绍如何使用一种称为字段过滤器的特殊变量类型,为 Metabase 中的 SQL 查询添加智能 SQL 过滤器控件。

字段过滤器简介

A Field Filter is a special type of variable that can wire up a variable in your SQL code to a field (column) in a table, which enables it to create a

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

To create a Field Filter, add a variable to your SQL code by enclosing the variable in double braces (Mustache style), and select Field Filter as the Variable type from the Variables sidebar.

字段过滤器一开始可能会让一些人感到困惑,因为人们期望它们的行为方式与基本输入变量(它们不是)相同。然而,字段过滤器非常值得学习,因为你可以用它们来创建更复杂的过滤器控件。本文将深入介绍字段过滤器,但首先让我们讨论字段过滤器变量与基本文本、数字和日期变量之间的主要区别。

区分字段过滤器和简单的文本、数字和日期变量

  1. 字段过滤器默认是可选的。 如果没有提供值,SQL 查询将像字段过滤器不存在一样运行。但是,你可以选择要求提供值。
  2. 字段过滤器使用特殊的语法,以便它们可以在后台处理 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}} 变量只接受单个值。

相比之下,字段过滤器会将变量映射到实际的列数据。连接到变量的过滤器控件然后“知道”哪些类别可用,并可以呈现这些类别的下拉菜单,如下所示:

A filter widget created by a Field Filter that

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

In the Data Model tab of the Admin Panel, Admins can edit the field settings. For fields of type Category, Admins can select three options for field widgets: Search box, A list of all values (dropdown), or Plain input box.

请注意,如果列中的不同值数量大于 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

Setting a variable

我们不会要求提供变量,因此不需要默认值。如果查询在过滤器控件中没有指定值而运行,查询将返回所有类别的记录。

请注意,WHERE 子句未指定变量应等于哪个列。这种隐式语法(隐藏的 SQL 代码)允许字段过滤器在后台处理 SQL 代码以适应多个选择。

为日期字段创建复杂的 SQL 过滤器控件

我们可以创建一个基本输入变量(日期类型),这将添加一个带有简单日期过滤器的 SQL 过滤器控件。相反,如果我们使用字段过滤器变量,我们可以将其连接到包含日期的字段(列),这为配置我们的过滤器控件解锁了更多选项。这是 SQL:

SELECT *
FROM ORDERS
WHERE {{created_at}}

Setting the Field to map to option to a field containing dates will open up a range of Filter widget types: Month and Year, Quarter and Year, Single Date, Date Range, Relative Date, and Date Filter.

以下是映射到日期字段的字段过滤器的不同控件类型:

  • 月和年
  • 季度和年
  • 单日期
  • 日期范围
  • 相对日期
  • 日期过滤器

每种控件类型都提供了不同的方式供人们筛选结果。以下是三个 SQL 字段过滤器示例:

The Month and Year widget type.

The Relative Date widget type.

The Date Filter widget type.

日期过滤器控件类型提供了最大的灵活性,允许人们按相对日期和范围进行筛选。

字段过滤器注意事项

人们在尝试实现字段过滤器时,通常会在以下几个地方卡住。

在 WHERE 子句中省略直接赋值

如上所述,字段过滤器周围的 SQL 代码不完全符合规范。你可能会想写:

-- DON'T DO THIS
WHERE category = {{ category }}

因为这对于标准 SQL 中的 WHERE 子句来说是正确的语法。但这种语法不适用于字段过滤器。字段过滤器的正确语法省略了 = 运算符:

WHERE {{ category }}

这种简写的原因是为了让 Metabase 可以在后台插入 SQL 代码来处理多选等情况,例如当用户从下拉列表中选择多个类别时。

了解有关 SQL 过滤器和变量的更多信息

查看我们的基本 SQL 输入变量——文本、数字和日期指南。

你还可以阅读我们的关于以下内容的文档:

这有帮助吗?

感谢您的反馈!
订阅新闻通讯
Metabase 的更新和新闻
© . This site is unofficial and not affiliated with Metabase, Inc.