jinja2 - 如何从 Jinja 列表变量 (DBT) 中删除括号

标签 jinja2 dbt

我创建了一个列表变量,如下所示:{% set options = ["a", "b", "c"] %}

我想在 SQL CTE 中使用它,如下所示:

df as (
 select *
 from my_table
 pivot (sum(value) for option in ({{options}}))
)

当DBT编译SQL时,结果为:

df as (
 select *
 from my_table
 pivot (sum(value) for option in (["a", "b", "c"]))
)

由于括号的原因,这是行不通的。那么如何使用不包含括号的列表变量呢?

最佳答案

@larsks 是对的,您希望从列表中创建一个字符串,而不是更改列表的显示方式。

最简单的方法是使用 jinja 中的 join 过滤器:

{% set options = ["a", "b", "c"] %}
{{ options | join(", ")}}
-- compiles to:
a, b, c

这对于数字来说效果很好,但是要将字符串文字放入您的 SQL 查询中,您需要引用列表中的值。我更喜欢通过在列表本身中添加嵌套引号来做到这一点:

{% set options = ["'a'", "'b'", "'c'"] %}
{{ options | join(", ")}}
-- compiles to:
'a', 'b', 'c'

但是您也可以将额外的引号放在 join 的参数内,并将额外的引号连接到字符串的开头和结尾:

{% set options = ["a", "b", "c"] %}
{{ "'" ~ options | join("', '") ~ "'"}}
-- compiles to:
'a', 'b', 'c'

或者您可以将 jinja 表达式用单引号括起来以实现相同的效果,但我认为这很难阅读::

{% set options = ["a", "b", "c"] %}
'{{ options | join("', '") }}'
-- compiles to:
'a', 'b', 'c'

关于jinja2 - 如何从 Jinja 列表变量 (DBT) 中删除括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73313758/

相关文章:

python - 模板继承: pass data from parent to child

python - 从静态文件夹导入带有 jinja 的 javascript 文件

dbt - 选择除我转换的列之外的所有列?

sql - 配置 SQLFluff 规则

Flask - 使用装饰器和路由参数来渲染带有自定义 jinja2 标签的数据

python - Flask(使用 jinja2)可以使用 'windows-1251' 编码渲染模板吗?

jinja2 - dbt 宏可以接受其他宏作为参数吗?

sql - 使用数据构建工具(dbt)和雪花,如何检查列是否为日期字段?

python - 使用 Jinja 模板根据单元格值对表格中的单元格进行颜色编码

postgresql - 将索引添加到 dbt 模型列?