我创建了一个列表变量,如下所示:{% 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/