如何让DBT var函数支持以SQL函数作为默认变量?
解决dbt中var()函数使用SQL函数作为默认值的问题
问题原因
你之前的写法{{ var("date","current_date") }}会把第二个参数"current_date"当作字符串字面量输出,而不是让数据库执行SQL函数current_date。所以当未配置date变量时,最终生成的SQL会是'current_date' as dt,而不是调用current_date函数获取当前日期。
可行解决方案
方案1:使用Jinja条件判断
直接通过Jinja逻辑判断区分变量是否存在,存在则用配置值,否则使用SQL函数:
{% if var('date', none) is not none %} {{ var('date') }} {% else %} current_date {% endif %} as dt
方案2:结合Jinja的default与safe过滤器
用更简洁的写法,通过safe标记让dbt将current_date当作SQL代码而非字符串处理:
{{ var('date') | default('current_date', true) | safe }} as dt
注:第二个参数
true表示当变量为None或空值时,都会触发默认值替换。
配置说明
在project.yml中只需维护date变量即可,不需要额外配置current_date变量:
vars: # 取消注释下面一行即可使用指定日期,注释则自动用current_date # date: '2024-05-20'
这样就能实现预期效果:当project.yml中定义了date变量时,使用该值;未定义时,数据库执行current_date函数获取当前日期。
内容的提问来源于stack exchange,提问作者brunondjoyer
相关产品推荐
相关产品推荐

