可选变量
您可以使查询中的子句成为可选的。例如,您可以创建一个可选的 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 的文档。