使用 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 字段筛选器来构建更智能的筛选器小部件。