Metabase中文操作手册11--SQL参数
-
SQL 参数
metabase 具有在本机查询中允许变量的灵活能力。这使你可以使用过滤器小部件或查询的 网址 来动态地替换查询中的值。
一旦定义了变量,变量的选项和设置就会出现在本机 QueryBuilder 的 <gtr="11"/> 侧面板中。那么,如何定义变量呢?
定义变量
在本机查询中输入
{% raw %}{{variable_name}}{% endraw %}
将创建一个名为variable_name
的变量。变量可以在侧面板中指定类型,这会改变它们的行为。除“字段筛选”之外的所有变量类型都将导致在此问题上放置一个与所选变量类型对应的筛选小部件。当通过筛选器小部件选择一个值时,该值将替换 SQL 模板中出现的相应变量。如果你有多个过滤器小部件,你可以单击并拖动它们中的任何一个,以移动它们并重新排序它们。此示例定义了一个名为
cat
的变量,允许你在此查询中动态更改WHERE
子句:SELECT count(*) FROM products WHERE category = {% raw %}{{cat}}{% endraw %}
如果你正在编写一个 Native MongoDB 查询,那么你的查询将更像这样,在
cat
子句中定义了match
变量。{% raw %}[{ $match: { category: {{cat}} } }]{% endraw %}
要了解有关 SQL 变量的更多信息,请查看 使用 SQL 变量为图表创建过滤器小部件。
场过滤器变量类型
将变量设置为“字段筛选器”类型,允许你将其映射到当前数据库中任何表中的字段,并允许你显示一个下拉过滤器小部件,该小部件填充了将其连接到的字段的值。字段筛选器变量还允许你将 SQL 问题连接到仪表板筛选器(如果你将其放在仪表板中)。
当在现有列上添加筛选器时,字段筛选器变量将插入与 GUI 查询生成器生成的 SQL 类似的 SQL。这很有用,因为它允许你在本机查询中插入动态日期范围过滤器。在添加字段筛选器时,应该将该变量链接到特定的列。字段筛选器变量应该在 SQL 中的
WHERE
子句中使用,或者在 MongoDB 中的$match
子句中使用。注:
- 不支持表别名,因为字段筛选器根据映射的字段生成 SQL。
- 有些数据库需要
FROM
子句中的模式。甲骨文的一个例子是FROM "schema"."table"
。在 BigQuery 中,需要回勾,比如 ``from`dataset_name.table```。
示例:
SELECT count(*) FROM products WHERE {% raw %}{{date_var}}{% endraw %}
MongoDB 原生查询示例可能如下所示:
{% raw %}[ {$match: {{date_var}} } ]{% endraw %}
使用字段筛选器变量创建 SQL 问题筛选器
首先,在 SQL 中插入一个变量标记,比如
{% raw %}{{my_var}}{% endraw %}
。然后,在侧面板中,选择“字段筛选器”变量类型,并选择将变量映射到哪个字段。为了显示过滤器小部件,你必须选择一个字段,该字段在管理面板的“数据模型”部分中的“类型”是以下内容之一:- 类别
- 城市
- 实体键
- 实体名称
- 外键
- 国家
- UNIX 时间戳(秒)
- UNIX 时间戳(毫秒)
- 邮编或邮政编码
该字段也可以是一个 DateTime,它可以在数据模型中保留为“no semantic type”。
然后,你将看到一个标有“widget”的下拉框,它将允许你在问题中选择所需的过滤小部件的类型,这对于 DateTime 字段特别有用。如果你根本不想要一个关于这个问题的小部件,那么你可以选择“none”,例如,如果你只想允许将这个问题映射到一个仪表板过滤器,你可能会这样做(参见下面的详细内容)。
注意:如果你没有看到显示过滤器小部件的选项,请确保将映射字段设置为上述类型之一,然后尝试从管理面板的“数据库”部分手动同步数据库,以强制 metabase 扫描并缓存字段的值。
如果变量被映射到一个标记为:
- 头像图片网址
- 说明
- 电子邮件
- 枚举
- 包含 JSON 的字段
- 图像 URL
- 数字
- 纬度
- 经度
- URL
你可以在 字段过滤器:为 SQL 问题创建智能过滤器小部件 中了解更多信息。
设置默认值
如果你为字段筛选器输入一个默认值,那么每当你回到这个问题时,这个值都会在筛选器中被选中。但是,如果清除了筛选器,将不会传递任何值(即,甚至不传递默认值)。** 当在仪表板中查看 SQL 问题时,默认值对问题的行为没有影响。**
查询中的默认值
你还可以在查询中直接定义默认值,这在定义复杂的默认值时非常有用。请注意,哈希可能需要被你正在使用的数据库的注释语法替换。有些数据库使用双破折号作为注释语法。
日期过滤器的当前示例:
SELECT p.* FROM products p WHERE p.createdAt = [[ {% raw %}{{dateOfCreation}}{% endraw %} #]]CURRENT_DATE()
将 SQL 问题连接到仪表板过滤器
为了使保存的 SQL/Native 问题能够与仪表板过滤器一起使用,它必须至少包含一个字段过滤器。可以用于 SQL 问题的仪表板过滤器的类型取决于你映射到问题的字段过滤器的字段。例如,如果你有一个名为
{% raw %}{{var}}{% endraw %}
的字段过滤器,并将其映射到一个状态字段,则可以将位置仪表板过滤器映射到你的 SQL 问题。在本例中,你将创建一个新的仪表板或转到一个现有的仪表板,单击“编辑”按钮,添加包含状态字段过滤器的 SQL 问题,添加一个新的仪表板过滤器或编辑一个现有的位置过滤器,然后单击 SQL 问题卡上的下拉框,查看状态字段过滤器。在这里了解有关仪表板过滤器的更多信息。可选条款
要在本机查询中使子句成为可选的,请键入
[[brackets around a {% raw %}{{variable}}{% endraw %}]]
。如果variable
给定了一个值,那么整个子句都放入模板中。如果不是,则整个子句被忽略。在这个示例中,如果没有从它的 filter 小部件或 URL 中给
cat
任何值,那么查询将只选择products
表中的所有行。但是如果cat
确实有一个值,比如Widget
,那么查询将只抓取类别类型为Widget
的产品:SELECT count(*) FROM products [[WHERE category = {% raw %}{{cat}}{% endraw %}]]
或者在 MongoDB 中:
{% raw %} [ [[{ $match: {category: {{cat}}} },]] { $count: "Total" } ] {% endraw %}
要使用多个可选子句,你必须至少包括一个常规的
WHERE
子句,然后是可选子句,每个子句的开头都是AND
。示例:
SELECT count(*) FROM products WHERE True [[AND id = {% raw %}{{id}}{% endraw %}]] [[AND category = {% raw %}{{category}}{% endraw %}]]
当使用字段筛选器时,列名不应包含在 SQL 中。相反,应该将变量映射到侧面板中的字段。
示例:
SELECT count(*) FROM products WHERE True [[AND {% raw %}{{id}}{% endraw %}]] [[AND {% raw %}{{category}}{% endraw %}]]
下一步:在查询中引用已保存的问题
学习如何 在 SQL 查询中引用已保存的问题。