dbt-if/else宏不返回任何内容



我正在尝试使用dbt宏来转换调查结果。

我有一张类似于的表格

column1 column2
经常
从不 始终

感谢您花时间交流您的问题。这并不容易!当谈到dbt和Jinja:时,你似乎正在经历一个头号误解

Jinja不是要转换数据,而是要组成一个将发送到数据库的SQL查询。在jinja的花括号中的所有内容都被渲染后,您将得到一个可以发送到数据库的查询。

这个概念在像run_query(docs(这样的dbt宏中确实变得复杂,这些宏将进入数据库并获取信息。但是您获取的信息只能用于生成SQL字符串。

如果您使用Python的panda,那么您的示例听起来就像是在内存中进行转换的方法。在dbt-land中,只有字符串生成发生在内存中,尽管有时我们在进行新查询之前会从数据库中获取一些子字符串。因此,听起来您希望Jinja查看列中的每个值并进行替换,您真正需要做的是生成一个查询,指示数据库进行替换。我们在SQL中进行替换的方法是使用CASE WHEN语句(有关更多信息,请参阅Mode的CASE文档(

这可能更接近你想要的。请注意,最好将likert_map对象放入dbt种子表中。

{% set likert_map =
{"1": "always", "2": "often", "3": "sometimes", "4": "never"} %}
SELECT
CASE column_1
{% for key, value in likert_map.items() %}
WHEN '{{ value }}' THEN '{{ key }}'
{% endfor %}
ELSE 0 END AS column_1_new,
CASE column_2
{% for key, value in likert_map.items() %}
WHEN '{{ value }}' THEN '{{ key }}'
{% endfor %}
ELSE 0 END AS column_2_new
{% endfor %}
FROM
table

以下是一些使用映射字典信息进行SQL查询的相关问题:

  • 如何在dbt-jinja中将两个表连接到字典中
  • DBT-针对以数字为变量的循环问题

最新更新