使用 SQL 变量创建过滤器

如何使用基本的输入变量(文本、数字和日期)在原生的SQL查询中创建过滤器小部件。

本文介绍了如何使用原生SQL查询在Metabase中创建问题,以便问题的观看者可以插入值并筛选结果。虽然Metabase使得不使用SQL就可以轻松汇总和可视化数据,但数据分析师有时需要深入研究复杂的查询,他们可以使用Metabase的SQL编辑器来编写这些查询。

SQL变量和过滤器小部件简介

例如,使用Metabase中包含的示例数据库,我们可能会编写一个SQL查询来提取关于我们订单的产品信息,但我们希望问题的观看者指定他们想要查看的产品类别。为了给人们提供在保存的SQL查询中输入值的选项,我们可以编写带有变量的SQL查询,Metabase将自动创建人们可以使用来输入值的过滤器小部件。

An example question, written in SQL, that uses a basic text variable to power a filter widget. The widget allows people to enter text to filter records for product titles containing that text.

目前,我们只关注应用于SQL编写的问题的过滤器。有关仪表板上的过滤器,请参阅使用SQL查询添加仪表板过滤器

但是首先:你想用SQL编写问题,还是查询构建器更适合你的用例?

SQL问题和查询构建器问题

在我们深入添加过滤器小部件之前,考虑人们将如何使用我们的问题是值得的。如果我们只想给人们提供在仪表板上简单的过滤器小部件中插入值的选项,那么在查询构建器中编写问题并向我们的SQL代码添加变量是有意义的。

如果我们使用查询构建器来构建一个问题,那么就不需要过滤小部件了,因为我们的问题的观看者将拥有完整的查询构建原语套件,可以通过连接过滤汇总数据来根据他们的喜好对数据进行切片和切块。对于更复杂的问题,他们还将拥有自定义表达式,以及能够深入数据来放大订单,或者点击值来查看单个记录的功能——这些功能不适用于用SQL编写的查询。

The query builder interface for composing questions. You can join, filter, summarize, sort, use custom expressions, and more.

如果您可以使用查询构建器的功能来回答您的问题,我们建议您使用这些功能。但是,如果您需要自定义SQL命令或函数,并且希望用户能够过滤这些问题的结果,请继续阅读。

可用于原生SQL查询的不同类型变量

A SQL question with a basic input variable of type Date. The Variable type dropdown menu shows the four variable types you can include in your queries: Text, Number, and Date, as well as a special variable type called a Field Filter.

对于使用Metabase的原生SQL查询编辑器编写的问题,您可以选择以下四种类型的变量:

  • 文本
  • 数字
  • 日期
  • 字段过滤器

其中之一,字段过滤器与其他不同。事实上,最好将变量类型分为两大类:基本输入变量和字段过滤器。

  • 基本输入变量创建简单的过滤器小部件,人们可以输入值以过滤问题的结果。基本输入变量包括:

  • 字段过滤器变量是特殊的输入变量。它们比基本输入变量更复杂,并且行为不同。字段过滤器“连接”到列上,可以为人们提供下拉菜单以选择一个或多个值。

以下将介绍三种基本输入变量——文本、数字和日期,并在另一篇文章中介绍字段过滤器。但在那之前,让我们先了解在何时需要使用某一种类型的变量。

字段过滤器或基本输入变量?

何时使用基本输入变量

  • 用于简单的文本、数字和日期过滤。对于更灵活的日期过滤,请使用字段过滤器。
  • 通常,对于无数个值,这些值不适合包含在下拉菜单中(这将需要字段过滤器)。
  • 对于您可能需要在SQL中的输入变量上进行一些数据处理/整理的情况。

何时使用字段过滤器

  • 为人们提供一个下拉菜单以从定义的值中选择。请参阅可用字段类型列表
  • 提供多种日期过滤方式。
  • 将变量连接到仪表板上的过滤器小部件。

基本输入变量

基本输入变量接受文本、数字或日期等输入。当值不是预定义的或范围很广时(例如订单小计),基本输入变量很有用。日期是一个特殊情况:Metabase提供了允许人们选择日期和时间而不是输入值的控件。

基本输入变量:数字

让我们使用一个基本输入变量类型为数字。假设我们想创建一个问题,该问题返回所有来自Orders表的记录,但我们想给人们一个选择,可以根据订单的小计过滤订单。

让我们保持简单,只给人们一个输入数字的选择,这样问题就会返回小计大于该数字的订单记录。

要在查询中包含一个变量,只需将变量名用双大括号括起来,如下所示:{{变量}}。在这个例子中,我们将变量命名为 {{subtotal_var}}。以下是SQL语句

SELECT *
FROM orders
WHERE subtotal > {{subtotal_var}}

当我们向SQL查询中添加一个变量时,Metabase将在问题的顶部添加一个过滤器小部件,并滑出一个侧边栏来展示变量的选项。

A question using a basic variable of type Number, subtotal_var, that will add a filter widget, allowing people to filter for orders greater than the value they plug in.

以下是“变量侧边栏”中的选项

  • 变量类型:类型可以是文本数字日期字段过滤器。变量类型决定了变量小部件的输入界面(例如,对于日期,小部件将展示一个日期选择器)。
  • 过滤器小部件标签:变量在过滤器小部件中显示的名称,默认为SQL查询中的变量名。
  • 必填项?当你将变量设置为必填时,Metabase会提示你提供一个默认的过滤器小部件值,以便在问题首次加载时将其插入变量中。如果你提供默认值,Metabase将不会执行查询,直到提供一个值。

subtotal_var的情况下,我们想要

  • 变量类型设置为数字(因为我们处理的是小计)。
  • 过滤器小部件标签subtotal_var更改为小计(以便更容易阅读)。
  • 必填项切换为true。
  • 默认过滤器小部件值设置为0。这样,当问题运行时,它会自动返回所有结果;人们可以输入更高的小计以过滤结果。

现在我们可以将值插入到我们的小计小部件中,并过滤出小计大于该值的所有订单

Minimizing the SQL editor, and entering 100 into the Subtotal filter widget to filter for orders with Subtotals greater than 100.

使基本输入变量为可选

如果我们想使过滤器小部件为可选,我们可以将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}}

在这种情况下,将出现两个小部件,分别对应每个变量。

Question with multiple widgets: one for Subtotal Min, and one for Subtotal Max. Both values are toggled as required, with a default filter widget value set to 0.

基本输入变量:文本

让我们通过一个简单的文本输入变量来尝试一个例子。在这种情况下,我们想要创建一个带有过滤器小部件的问题,允许人们搜索包含他们输入到小部件中的文本的产品标题。

以下是代码

SELECT *
FROM products
[[WHERE UPPER(title) LIKE UPPER(CONCAT('%', {{search_term}},'%'))]]

我们将WHERE子句用括号括起来以使小部件输入为可选。我们在变量两边放置通配符字符%,以表示该术语左侧或右侧可以有零个或多个字符。此外,我们通过在title列和{{search_term}}上使用UPPER函数来避免大小写敏感。

以下是我们的过滤器

A basic text filter widget, filtering for titles that contain the word

基本输入变量:日期

当你选择日期变量类型时,过滤器小部件将展示一个简单的日期选择器。这是一个带有两个基本日期变量的问题,用户可以输入开始和结束日期以返回在这些日期之间下订单的订单。

SELECT *
FROM orders
[[WHERE created_at BETWEEN {{start_date}} AND {{end_date}}]]

Basic date widgets, with simple date pickers connected to the start_date and end_date variables in the optional WHERE clause.

请注意,为了使过滤器生效,用户需要为两个小部件都选择日期,这可能会导致意外的行为。例如,有人可能会留空结束日期,并期望订单从起始日期过滤到今天,但实际上不会应用任何过滤器。

对于日期,请考虑使用字段过滤器,它提供了更多的灵活性。

下一步:SQL问题的字段过滤器

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

下一篇文章