使用 SQL 变量创建筛选器
如何使用基本输入变量(用于文本、数字和日期)在原生 SQL 查询中创建筛选器小部件。
本文将介绍如何使用原生 SQL 查询在 Metabase 中创建问题,以便问题查看者可以插入值并筛选结果。虽然 Metabase 无需 SQL 即可轻松汇总和可视化数据,但数据分析师有时需要深入研究复杂的查询,他们可以使用 Metabase 的SQL 编辑器来编写这些查询。
SQL 变量和筛选器小部件简介
例如,使用 Metabase 附带的示例数据库,我们可能会用 SQL 编写一个问题,提取有关我们订单的产品信息,但我们希望该问题的查看者指定他们想要查看的产品类别。为了让用户可以选择在保存的 SQL 问题上输入值,我们可以使用变量编写 SQL 查询,Metabase 将自动创建筛选器小部件,供用户输入值。
目前,我们只关注应用于 SQL 编写问题的筛选器。有关仪表盘上的筛选器,请查看使用 SQL 问题向仪表盘添加筛选器。
但首先:您是想使用 SQL 编写问题,还是查询构建器更适合您的用例?
SQL 问题与查询构建器问题
在深入探讨添加筛选器小部件之前,值得考虑一下人们将如何使用我们的问题。如果只是想让用户可以选择在仪表盘上插入值到简单的筛选器小部件中,那么在**查询构建器**中编写问题并向 SQL 代码添加变量是合理的。
如果改为使用**查询构建器**来创建问题,则筛选器小部件是不必要的,因为问题的查看者将拥有全套查询构建原语,可以根据需要联接、筛选和汇总数据。对于更复杂的问题,他们还可以使用自定义表达式,以及通过深入分析数据来放大订单,或单击值来查看单个记录——这些功能不适用于 SQL 编写的问题。
如果您可以使用查询构建器中的功能来回答您的问题,我们建议您使用这些功能。但是,如果您需要自定义 SQL 命令或函数,并且希望用户能够筛选这些问题的结果,请继续阅读。
原生 SQL 查询可用的不同变量类型
对于使用 Metabase 的原生 SQL 查询编辑器创建的问题,您可以选择四种变量类型
- 文本
- 数字
- 日期
- 字段筛选器
其中一种类型,即**字段筛选器**,与其他类型不同。事实上,最好将变量类型分为两大类:基本输入变量和字段筛选器。
-
*基本输入变量*创建简单的筛选器小部件,人们可以在其中插入值来筛选问题结果。基本输入变量包括
-
*字段筛选器变量*是特殊的输入变量。它们比基本输入变量更复杂,并且行为也不同。字段筛选器“连接”到列,可以提供下拉菜单供人们选择一个或多个值。
我们将在下面介绍三种基本输入变量——文本、数字和日期——以及在另一篇文章中介绍字段筛选器。但首先,让我们了解一下何时选择一种变量类型而不是另一种。
字段筛选器还是基本输入变量?
何时使用基本输入变量
- 用于简单的文本、数字和日期筛选。对于更灵活的日期筛选,请使用字段筛选器。
- 通常,对于不适合包含在下拉菜单中(需要字段筛选器)的无数值。
- 对于可能需要在 SQL 中对输入变量进行一些数据整理/清洗的情况。
何时使用字段筛选器
- 提供一个下拉菜单供人们从定义的值中选择。
- 提供多种日期筛选方式。
- 将变量连接到仪表盘上的筛选器小部件。
基本输入变量
基本输入变量接受文本、数字或日期等输入。当值未预定义或范围广泛(例如订单小计)时,基本输入变量非常有用。日期是一种特殊情况:Metabase 提供小部件,允许人们选择日期和时间,而不是手动输入值。
基本输入变量:数字
让我们使用类型为“数字”的基本输入变量。假设我们想创建一个问题,该问题返回“订单”表中的所有记录,但我们希望用户可以选择根据订单**小计**来筛选订单。
我们保持简单,只给用户输入一个数字的选项,这样问题将返回小计**大于**该数字的订单记录。
要在查询中包含变量,只需将变量名用双括号括起来,如下所示:{{ variable }}
。在本例中,我们将变量命名为{{subtotal_var}}
。SQL 如下:
SELECT *
FROM orders
WHERE subtotal > {{subtotal_var}}
当我们将变量添加到 SQL 查询时,Metabase 将在问题顶部添加一个筛选器小部件,并滑出侧边栏以显示变量选项。
以下是**变量侧边栏**中的选项
- *变量类型:*类型可以是
Text
、Number
、Date
或Field filter
。变量类型决定了变量小部件的输入界面(例如,对于Date
,小部件将显示日期选择器)。 - *筛选器小部件标签:*变量在小部件中显示的名称,默认为 SQL 查询中的变量名。
- *必填项?*当您将变量设为必填项时,Metabase 会在问题首次加载时提示您输入一个默认筛选器小部件值以插入到变量中。如果您**未**提供默认值,Metabase 将不会执行查询,直到提供值。
在 subtotal_var
的情况下,我们想要
- 将
Variable type
设置为Number
(因为我们处理的是小计)。 - 将
Filter widget label
从subtotal_var
更改为Subtotal
(只是为了更易于阅读)。 - 将
Required?
切换为 true。 - 将
Default filter widget value
设置为0
。这样,当问题运行时,它将自动返回所有结果;如果用户希望筛选结果,可以输入更高的小计。
现在我们准备好将值插入到我们的小计小部件中,并筛选小计大于该值的订单
使基本输入变量可选
如果我们要使筛选器小部件可选,我们可以将 WHERE
子句括在双括号中
SELECT *
FROM orders
[[WHERE subtotal > {{subtotal_var}}]]
如果 WHERE
子句在括号中,并且查看者未输入小计且未设置默认值,则查询将仅返回 Orders
表中的所有记录(即,Metabase 将只运行 SELECT * FROM orders
)。
添加多个筛选器
我们也可以使用多个筛选器。例如,如果人们希望通过输入小计值范围来筛选结果,我们可以为上限和下限添加两个变量
SELECT *
FROM orders
WHERE subtotal BETWEEN {{subtotal_min}} AND {{subtotal_max}}
在这种情况下,将出现两个小部件,每个变量一个。
基本输入变量:文本
让我们尝试一个使用简单文本输入变量的示例。在这种情况下,我们希望创建一个问题,其中包含一个筛选器小部件,允许人们搜索包含他们在小部件中输入的文本的产品标题。
这是代码
SELECT *
FROM products
[[WHERE UPPER(title) LIKE UPPER(CONCAT('%', {{search_term}},'%'))]]
我们将 WHERE
子句括在括号中,以使小部件输入可选。我们使用通配符 %
将变量两端括起来,表示该术语的左侧或右侧可以有零个或多个字符。此外,我们通过对 title
列和 {{search_term}}
使用 UPPER
函数来防止大小写敏感。
这是我们的筛选器
基本输入变量:日期
当您选择“日期”变量类型时,筛选器小部件将显示一个简单的日期选择器。这是一个包含两个基本日期变量的问题,以便用户可以输入开始日期和结束日期,以返回这些日期之间下的订单。
SELECT *
FROM orders
[[WHERE created_at BETWEEN {{start_date}} AND {{end_date}}]]
请注意,人们需要为*两个*小部件选择日期才能激活筛选器,这可能会导致意外行为。例如,有人可能会将结束日期留空,并期望订单从开始日期筛选到今天,但实际上并未应用任何筛选器。
对于日期,请考虑改用字段筛选器,它提供了更大的灵活性。