You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:57:03