如何在DBT中正确合并不同宏输出的元组
DBT宏合并元组实现方案
你当前使用UNION ALL的写法存在问题:UNION ALL是SQL用于合并查询结果集的语法,不能直接拼接元组字面量,会生成非法SQL。
方案1:直接拼接元组(无去重)
如果两个宏输出的元组无重复元素,只需将两个元组的内容提取后拼接即可:
{% macro days15() %} (1, 2, 3, 4, 5) {% endmacro %} {% macro days69() %} (6,7,8,9) {% endmacro %} {% macro days19() %} {# 提取两个宏返回结果的内容,去除首尾括号和空白 #} {%- set d15_content = days15().strip().strip('()') -%} {%- set d69_content = days69().strip().strip('()') -%} {# 拼接成完整元组 #} ({{ d15_content }}, {{ d69_content }}) {% endmacro %}
调用{{ days19() }}后输出结果为:(1, 2, 3, 4, 5, 6, 7, 8, 9)
方案2:取元素并集(自动去重)
如果两个元组存在重复元素,需要先解析为列表取并集后再生成元组:
{% macro days19() %} {# 解析days15的输出为整数列表 #} {%- set d15_list = days15().strip().strip('()').split(',') | map('trim') | map('int') | list -%} {# 解析days69的输出为整数列表 #} {%- set d69_list = days69().strip().strip('()').split(',') | map('trim') | map('int') | list -%} {# 取两个列表的并集后排序 #} {%- set union_list = d15_list | union(d69_list) | sort -%} {# 拼接为元组格式输出 #} ({{ union_list | join(', ') }}) {% endmacro %}
该方案会自动去除两个元组中的重复元素,符合并集的逻辑要求。
内容的提问来源于stack exchange,提问作者letsBeePolite
相关产品推荐
相关产品推荐

