可选变量

您可以使查询中的子句成为可选的。例如,您可以创建一个可选的 WHERE 子句,其中包含一个SQL 变量,这样如果没有为该变量提供值(无论是在筛选器中还是通过 URL),查询仍将运行,就像没有 WHERE 子句一样。

要使变量在您的原生查询中成为可选的,请在包含 {{variable}} 的整个子句周围加上 [[ .. ]] 括号。如果有人在筛选器小部件中为 variable 输入了值,Metabase 会将该子句放入模板中;否则,Metabase 会忽略该子句并像该子句不存在一样运行查询。

在此示例中,如果未给 cat 赋值,则查询将只选择 products 表中的所有行。但是如果 cat 有值,例如“Widget”,那么查询将只获取类别类型为“Widget”的产品。


SELECT
  count(*)
FROM
  products
[[WHERE category = {{cat}}]]

您的 SQL 还必须能够在没有 [[ ]] 中可选子句的情况下运行

您需要确保当没有值传递给括号子句中的变量时,您的 SQL 仍然有效。

例如,如果未为 cat 提供值,则从括号子句中排除 WHERE 关键字将导致错误。

-- this will cause an error:

SELECT
  count(*)
FROM
  products
WHERE
  [[category = {{cat}}]]

这是因为当没有为 cat 提供值时,Metabase 将尝试执行 SQL,就好像 [[ ]] 中的子句不存在一样。

SELECT
  count(*)
FROM
  products
WHERE

这不是一个有效的 SQL 查询。相反,应将整个 WHERE 子句放在 [[ ]] 中。


SELECT
  count(*)
FROM
  products
[[WHERE
  category = {{cat}}]]

当没有为 cat 提供值时,Metabase 仍然会执行一个有效的查询。


SELECT
  count(*)
FROM
  products

使用多个可选子句时,您至少需要一个 WHERE

要使用多个可选子句,您必须至少包含一个常规的 WHERE 子句,后面跟着可选子句,每个子句都以 AND 开头。


SELECT
  count(*)
FROM
  products
WHERE
  TRUE
  [[AND id = {{id}}]]
  [[AND {{category}}]]

最后一个子句使用字段筛选器(注意 AND 子句中没有列)。使用字段筛选器时,您必须在查询中排除该列;您需要在侧面板中映射变量。

MongoDB 中的可选变量

如果您正在使用 MongoDB,可以像这样使一个子句成为可选的


[
    [[{
        $match: {category: {{cat}}}
    },]]
    {
        $count: "Total"
    }
]

或者使用多个可选筛选器


[
    [[{ $match: {{cat}} },]]
    [[{ $match: { price: { "$gt": {{minprice}} } } },]]
    {
        $count: "Total"
    }
]

在查询中设置复杂的默认值

您还可以通过在可选参数的结束括号内包含注释语法,直接在查询中定义默认值。

WHERE column = [[ {{ your_parameter }} --]] your_default_value

当您向 your_parameter 传递值时,注释将“激活”。

这在定义复杂的默认值时非常有用(例如,如果您的默认值是一个函数,如 CURRENT_DATE)。这里是一个 PostgreSQL 的例子,它使用 CURRENT_DATE 将日期筛选器的默认值设置为当前日期。


SELECT
  *
FROM
  orders
WHERE
  DATE(created_at) = [[ {{dateOfCreation}} --]] CURRENT_DATE

如果您向变量传递一个值,WHERE 子句会运行,包括注释掉默认的 CURRENT_DATE 函数的注释语法。

请注意,用于注释文本的哈希符号(--)可能需要替换为您正在使用的数据库特定的注释语法。

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

这有帮助吗?

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