使用 SQL 变量创建过滤器
如何在原生 SQL 查询中使用文本、数字和日期的基本输入变量创建过滤器小部件。
本文介绍了如何在 Metabase 中使用原生 SQL 查询创建问题,以便我们问题的查看者可以插入值并筛选结果。虽然 Metabase 可以轻松地在没有 SQL 的情况下汇总和可视化数据,但数据分析师有时需要深入研究复杂的查询,他们可以使用 Metabase 的SQL 编辑器编写这些查询。
SQL 变量和过滤器小部件简介
例如,使用 Metabase 随附的示例数据库,我们可能会在 SQL 中编写一个问题,提取有关我们订单的产品信息,但我们希望该问题的查看者指定他们想要查看的产品类别。为了让人们可以选择在已保存的 SQL 问题上输入值,我们可以使用变量编写 SQL 查询,Metabase 将自动创建过滤器小部件,供人们输入值。
目前,我们将只关注应用于以 SQL 编写的问题的过滤器。有关仪表盘上的过滤器,请查看使用 SQL 问题向仪表盘添加过滤器。
但首先:您想使用 SQL 编写问题,还是查询构建器更适合您的用例?
SQL 问题与查询构建器问题
在我们深入研究添加过滤器小部件之前,值得考虑人们将如何使用我们的问题。如果我们只想让人们可以选择将值插入仪表盘上的简单过滤器小部件,那么在查询构建器中编写问题并在我们的 SQL 代码中添加变量是有意义的。
相反,如果我们使用查询构建器编写问题,则过滤器小部件是不必要的,因为我们问题的查看者将拥有全套查询构建原语,可以通过连接、筛选和汇总数据来随意切片和切块数据。对于更复杂的问题,他们还将拥有自定义表达式供他们支配,并且还能够下钻数据以放大订单,或单击值以查看单个记录——此功能不适用于以 SQL 编写的问题。
如果您可以使用查询构建器中的功能回答您的问题,我们建议您使用这些功能。但是,如果您需要自定义 SQL 命令或函数,并且您希望用户能够筛选这些问题的结果,请继续阅读。
可用于原生 SQL 查询的不同类型的变量
对于使用 Metabase 的原生 SQL 查询编辑器编写的问题,您可以选择四种类型的变量
- 文本
- 数字
- 日期
- 字段过滤器
这些类型中的一种,字段过滤器,与其他类型不同。事实上,最好将变量类型分为两个主要类别:基本输入变量和字段过滤器。
-
基本输入变量创建简单的过滤器小部件,人们可以在其中插入值以筛选问题的结果。基本输入变量包括
-
字段过滤器变量是特殊的输入变量。它们比基本输入变量更复杂,并且行为不同。字段过滤器“连接”到列,并且可以提供下拉菜单,供人们选择一个或多个值。
我们将在下面介绍三个基本输入变量——文本、数字和日期,并在另一篇文章中介绍字段过滤器。但首先,让我们了解何时选择一种类型的变量而不是另一种。
字段过滤器或基本输入变量?
何时使用基本输入变量
- 用于简单的文本、数字和日期筛选。为了更灵活的日期筛选,请使用字段过滤器。
- 一般来说,对于无数个不适合包含在下拉菜单中的值(这将需要字段过滤器)。
- 对于您可能需要在 SQL 中对输入变量进行一些数据整理/数据清洗的情况。
何时使用字段过滤器
- 提供下拉菜单,供人们从中选择定义的值。请参阅列表的可用字段类型。
- 提供多种按日期筛选的方式。
- 将变量连接到仪表盘上的过滤器小部件。
基本输入变量
基本输入变量接受文本、数字或日期等输入。当值未预定义或范围广泛时,例如订单小计时,基本输入变量非常有用。日期是一种特殊情况:Metabase 提供的窗口小部件允许人们选择日期和时间,而不是键入值。
基本输入变量:数字
让我们使用数字类型的基本输入变量。假设我们想要创建一个问题,该问题返回 Orders
表中的所有记录,但我们希望让人们可以选择根据订单 subtotal
过滤掉订单。
让我们保持简单,只让人们可以选择输入一个数字,以便问题将返回小计大于该数字的订单记录。
要在查询中包含变量,只需将变量名称用双大括号括起来,如下所示:{{ variable }}
。在本例中,我们将我们的变量称为 {{subtotal_var}}
。以下是 SQL
SELECT *
FROM orders
WHERE subtotal > {{subtotal_var}}
当我们将变量添加到 SQL 查询时,Metabase 会在问题顶部添加一个过滤器小部件,并滑出一个侧边栏以显示变量的选项。
以下是变量侧边栏中的选项
- 变量类型:类型可以是
文本
、数字
、日期
或字段过滤器
。变量类型决定了变量小部件的输入界面(例如,对于日期
,小部件将显示日期选择器)。 - 过滤器小部件标签:变量的名称,如小部件中所示,默认为 SQL 查询中的变量名称。
- 必需?当您使变量成为必需时,Metabase 会提示您输入一个默认过滤器小部件值,以便在首次加载问题时插入到变量中。如果您不提供默认值,则 Metabase 不会在提供值之前执行查询。
在 subtotal_var
的情况下,我们希望
- 将
变量类型
设置为数字
(因为我们正在处理小计)。 - 将
过滤器小部件标签
从subtotal_var
更改为小计
(只是为了使其更易于阅读)。 - 将
必需?
切换为 true。 - 将
默认过滤器小部件值
设置为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}}]]
请注意,人们需要为两个组件都选择日期才能激活筛选器,这可能会导致意外行为。例如,有人可能会将结束日期留空,并期望订单从开始日期筛选到今天,但实际上不会应用任何筛选器。
对于日期,请考虑改用字段筛选器,它提供了更大的灵活性。
下一步:SQL 问题的字段筛选器
了解如何在 SQL 查询中使用 Metabase 字段筛选器来构建更智能的筛选器组件。