You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Snowflake使用Infer Schema+Template建表时列名带双引号问题求助

问题成因及解决方法

成因

Snowflake的INFER_SCHEMA函数会严格保留CSV表头的原始大小写。当通过USING TEMPLATE建表时,模板会将包含小写字母的列名自动包裹成双引号,生成大小写敏感的带引号标识符。而Snowflake对不带引号的查询标识符会自动转换为大写,因此直接执行select field1 from RAW.TEST时,实际是查询大写的FIELD1列,与表中带引号的"field1"列不匹配,导致报错。

解决方法

修改建表语句,在构造模板对象时将列名统一转换为大写(或符合Snowflake无引号标识符规则的格式),避免生成带引号的列名。调整后的代码如下:

CREATE OR REPLACE TABLE RAW.TEST 
USING TEMPLATE (
    SELECT ARRAY_AGG(
        OBJECT_CONSTRUCT(
            'NAME', UPPER(COLUMN_NAME),
            'TYPE', DATA_TYPE,
            'NULLABLE', IS_NULLABLE
        )
    ) 
    FROM TABLE(
        INFER_SCHEMA(
            LOCATION=>'@RAW.STAGE/',
            FILE_FORMAT=>'RAW.CSV_FORMAT', 
            FILES => ('example.csv')
        )
    )
);

说明

  • UPPER(COLUMN_NAME)将推断出的列名转为大写,Snowflake会将其识别为无引号的标识符,存储为大写列名。后续查询时,无论输入select FIELD1 from RAW.TEST还是select field1 from RAW.TEST,Snowflake都会自动转换为大写匹配,无需添加双引号。
  • 如果需要保留列名的小写格式且无需双引号,需确保CSV表头列名符合Snowflake无引号标识符规则(仅包含大写字母、数字和下划线,且不以数字开头),此时可将UPPER替换为LOWER,但查询时需输入对应小写列名(Snowflake会将不带引号的小写标识符自动转为大写,因此这种场景下更推荐统一使用大写列名)。

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

火山引擎 最新活动