如何在dbt宏循环中用AND拼接多表多列连接条件?
dbt宏实现多列带空值匹配的左连接条件拼接
针对你需要循环生成多列连接条件并自动用AND拼接的需求,有两种简洁的实现方式:
方法一:利用列表生成+join过滤器(推荐)
先将每个列的连接条件存入列表,最后用' AND '作为分隔符拼接所有条件,自动避免多余的连接符:
SELECT {% for col in all_cols %} A.{{ col }}{% if not loop.last %},{% endif %} {% endfor %} FROM A LEFT JOIN B ON {% set join_conditions = [] %} {% for col in all_cols %} {% do join_conditions.append("(A." ~ col ~ " = B." ~ col ~ " OR (IS_NAN(A." ~ col ~ ") AND IS_NAN(B." ~ col ~ ")))") %} {% endfor %} {{ join_conditions | join(' AND ') }}
方法二:循环内判断loop.last
在循环输出每个列的条件后,判断当前是否为最后一列,仅在非最后一列时添加AND:
SELECT {% for col in all_cols %} A.{{ col }}{% if not loop.last %},{% endif %} {% endfor %} FROM A LEFT JOIN B ON {% for col in all_cols %} (A.{{col}} = B.{{col}} OR (IS_NAN(A.{{col}}) AND IS_NAN(B.{{col}}))) {% if not loop.last %} AND {% endif %} {% endfor %}
额外注意
SELECT部分的列后逗号也要用loop.last处理,避免编译后的SQL出现末尾多余逗号的语法错误。
内容的提问来源于stack exchange,提问作者ningl
相关产品推荐
相关产品推荐

