字段筛选器

字段过滤器是您可以直接连接到数据库字段的特殊变量。

何时使用字段过滤器变量,何时使用基本变量

通常情况下,优先使用字段过滤器变量。它们提供具有下拉菜单和动态日期选择器的“智能”过滤器小部件。

但是,如果您的查询中缺少用于连接过滤器的数据库字段,那么您需要改用基本变量。例如,如果您想按自定义列进行筛选,则需要使用基本变量。

字段过滤器变量

添加字段过滤器

  1. 将变量添加到WHERE子句.
  2. 将字段过滤器连接到数据库字段.
  3. 配置您的过滤器小部件.

字段过滤器语法

假设您想创建一个字段过滤器变量,用于按state字段筛选People表。

这是字段过滤器的语法


SELECT
  *
FROM
  PEOPLE
WHERE
  {{state}}

注意缺少列和运算符(它不是WHERE state = {{state}},而是WHERE {{state}})。您需要以这种方式构造字段过滤器变量,以便处理 Metabase 为您生成代码的情况。例如,对于处理用户在过滤器小部件中选择多个值或日期范围的情况,Metabase 将必须内插 SQL 代码以处理这些输入到变量中。

在 MongoDB 原生查询中,您需要将字段过滤器放入$match子句中。

[ {$match: {{date_var}} } ]

将字段过滤器连接到数据库字段

为了使字段过滤器变量正常工作,您需要将变量与数据库字段关联起来。

  1. 转到侧边栏的变量和参数。
  2. 变量类型下,选择“字段过滤器”变量类型。
  3. 选择要将哪个字段映射到您的变量(在本例中,我们将产品表中的Category字段映射到此变量)。

您只能将字段过滤器映射到数据库字段。如果您无法使用字段过滤器,可以回退到使用基本变量

指定表和字段别名

如果将过滤器映射到别名表的字段,您需要将该别名告知 Metabase,否则过滤器将不起作用。

例如,假设您想将字段过滤器映射到products表中的category字段,但在查询中,您对products表使用了别名p,如下所示:


SELECT
  *
FROM
  products AS p
WHERE
  {{category_filter}}

如果您映射到产品表中的category字段,您还需要填写表和字段别名输入框,让 Metabase 知道该别名。在这种情况下,您输入p.category

只有当您的查询使用别名来引用包含您要映射过滤器的字段的表时,才需要设置此表和字段别名

这是另一个示例,这次是使用 CTE


WITH
  expensive_products AS (
    SELECT
      *
    FROM
      products
    WHERE
      price > 50
  )
SELECT
  *
FROM
  expensive_products
WHERE
  {{category_filter}}

在这里,我们再次将字段过滤器映射到products表中的category字段。但由于我们使用了别名为expensive_products的 CTE,我们在表和字段别名输入框中输入expensive_products.category才能使映射正常工作。

字段过滤器必须连接到查询中包含的数据库字段

您的主查询应了解字段过滤器变量指向的所有表,否则您将收到 SQL 语法错误。例如,假设您的主查询包含如下字段过滤器:


SELECT
  *
FROM
  ORDERS
WHERE
  {{ product_category }}

假设{{ product_category }}变量引用了使用Products表的另一个问题。为了使字段过滤器正常工作,您需要在主查询中包含一个到Products的连接。


SELECT
  *
FROM
  ORDERS
  JOIN PRODUCTS ON ORDERS.product_id = PRODUCTS.id
WHERE
  {{ product_category }}

如果您无法使用字段过滤器,则可以改用基本变量

BigQuery 和 Oracle 中的字段过滤器

确保您的 SQL 方言与您选择的数据库匹配。关于查询中表引用的常见问题

数据库 方言怪癖 示例
BigQuery 模式和表必须用反引号引用。 FROM `dataset.table`
Oracle 模式和表必须用双引号引用。 FROM "schema.table"

如需更多帮助,请参阅SQL 错误消息故障排除

使字段过滤器成为可选

请参阅可选变量

阅读其他版本的 Metabase 的文档。

这有帮助吗?

感谢您的反馈!
想改进这些文档吗?提议更改。
© . This site is unofficial and not affiliated with Metabase, Inc.