【问题标题】:dbt if/else macros return nothingdbt if/else 宏不返回任何内容
【发布时间】:2022-01-17 21:18:29
【问题描述】:

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

我有一个类似的表:

column1 column2
often sometimes
never always
... ...

我想把它变成:

column 1 column 2
3 2
1 4
... ...

使用以下映射:

category value
always 4
often 3
sometimes 2
never 1

为此,我编写了以下 sbt 宏:

{% macro class_to_score(class) %} 
    {% if class == "always" %}
        {% set result = 1 %}
    {% elif class == "often" %}
        {% set result = 2 %}
    {% elif class == "sometimes" %}
        {% set result = 3 %}
    {% elif class == "never" %}
        {% set result = 4 %}
    {% endif -%}
    {{ return(result) }}
{% endmacro %}

然后是下面的sql查询:

{%- set class_to_score = class_to_score -%}

select 
    {{ set_class_to_score(column1) }} as column1_score,
from
    table

但是,我得到了错误:

Syntax error: SELECT list must not be empty at [5:1]

有人知道我为什么收不到任何东西吗?

【问题讨论】:

    标签: sql dbt


    【解决方案1】:

    感谢您花时间交流您的问题。这并不容易!当谈到 dbt 和 Jinja 时,您似乎遇到了第一个误解:

    Jinja 不是关于转换数据,而是关于编写将发送到数据库的单个 SQL 查询。在 jinja 的大括号内的所有内容都呈现后,您将得到一个可以发送到数据库的查询。

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

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

    这可能更接近您想要的。请注意,最好将 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查询的相关问题:

    【讨论】:

      猜你喜欢
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      • 2020-04-27
      • 2019-04-06
      相关资源
      最近更新 更多