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

如何在dbt中为JSONB字段提取的列名添加单引号?

解决dbt展平JSONB字段时键名未加单引号的报错问题

你当前用dbt展平JSONB类型的_airbyte_data列时,生成的SQL里->>操作符后的JSON键名没有被单引号包裹,PostgreSQL会把这些键名识别为数据库列名,因此抛出column "simid" does not exist的错误。

修复方案

只需要在循环生成字段引用的代码中,给动态获取的键名加上单引号即可。修改后的核心循环代码如下:

{% for column_name in results_list %}
_airbyte_data->>'{{ column_name }}' as {{ column_name }}{% if not loop.last %},{% endif %}
{% endfor %}

修改后的完整dbt代码

{% set survey_methods_query %}

SELECT DISTINCT(jsonb_object_keys(_airbyte_data)) as column_name 
from {{source('survey-cto', 'raw_surveycto')}}
{% endset %}

{% set results = run_query(survey_methods_query) %}

{% if execute %}
{# Return the first column #}
{% set results_list = results.columns[0].values() %}
{% else %}
{% set results_list = [] %}
{% endif %}

select
_airbyte_data,
{% for column_name in results_list %}
_airbyte_data->>'{{ column_name }}' as {{ column_name }}{% if not loop.last %},{% endif %}
{% endfor %}
from {{source('survey-cto', 'raw_surveycto')}}

编译后生成的正确SQL

修改后编译出的SQL会自动给JSON键名加上单引号,格式示例如下:

select
_airbyte_data,

_airbyte_data->>'simid' as simid,

_airbyte_data->>'lease_season_None' as lease_season_None,
...

此时PostgreSQL能正确识别这些是JSONB字段的键名,而非数据库列名,报错问题即可解决。

内容的提问来源于stack exchange,提问作者Siddhant Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:05:25