可选变量
您可以使查询中的一个子句成为可选的。例如,您可以创建一个可选的 WHERE 子句,其中包含一个 SQL 变量,这样,如果您不为该变量提供值(无论是通过过滤器还是通过 URL),查询仍会像没有 WHERE 子句一样运行。
要在原生查询中使变量可选,请将包含 {{variable}} 的整个子句放在 [[ .. ]] 方括号内。如果有人在 variable 的过滤器控件中输入了值,Metabase 将把该子句放入模板;否则,Metabase 将忽略该子句,并像该子句不存在一样运行查询。
在此示例中,如果未为 cat 提供值,则查询将仅从 products 表中选择所有行。但如果 cat 有值,例如“Widget”,则查询将仅获取类别类型为 Widget 的产品。
SELECT
count(*)
FROM
products
[[WHERE category = {{cat}}]]
您的 SQL 也必须能够在 [[ ]] 中的可选子句不存在的情况下运行。
您需要确保在未将值传递给括号内子句中的变量时,您的 SQL 仍然有效。
例如,如果从括号内的子句中省略 WHERE 关键字,则在未为 cat 提供值时会导致错误。
-- 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 的文档。