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




