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

DuckDB宏大小写敏感性问题:小写列名调用宏报错求助

DuckDB宏大小写敏感问题原因及解决办法

问题原因

DuckDB默认对未加引号的标识符(列名、表名、函数名等)会自动转为大写后存储到系统元数据中。你的宏逻辑里,LIST_CONTAINS(GROUPBY_COLUMNS, C)是直接用传入的列名字符串和系统存储的大写列名做匹配:

  • 调用宏时传入小写列名[col1,col2],参数GROUPBY_COLUMNS里的元素是小写的'col1'、'col2'
  • 但系统中实际存储的列名是大写的'COL1'、'COL2',两者匹配失败,导致COLUMNS()表达式返回空列集,触发绑定错误。

解决办法

方案1:宏内部统一转为大写匹配

修改宏定义,将传入的列名参数统一转为大写后再做匹配,这样无论调用时传大写还是小写列名都能正常工作:

CREATE OR REPLACE MACRO FUN_AGGREGATE(
    GROUPBY_COLUMNS,
    AGGREGATED_COLUMNS
) AS TABLE (
    FROM TBL
    SELECT 
        COLUMNS(C -> (LIST_CONTAINS(LIST_TRANSFORM(GROUPBY_COLUMNS, x -> UPPER(x)), C) OR LEN(GROUPBY_COLUMNS) = 0)), 
        FUN(COLUMNS(C -> LIST_CONTAINS(LIST_TRANSFORM(AGGREGATED_COLUMNS, x -> UPPER(x)), C)))  
    GROUP BY ALL 
    ORDER BY ALL 
);

修改后,fun_aggregate([col1,col2],[numcol])和fun_aggregate([COL1,COL2],[NUMCOL])都能正常返回聚合结果。

方案2:调用宏时传入大写列名

直接使用和系统存储一致的大写列名调用宏,即可避免匹配失败:

WITH tbl AS (SELECT * FROM sample_table)
FROM fun_aggregate([COL1,COL2],[NUMCOL]);

验证结果

修改宏后用小写列名调用,会得到和大写调用一致的结果:

WITH tbl AS (SELECT * FROM sample_table)
FROM fun_aggregate([col1,col2],[numcol]);
┌─────────┬─────────┬────────┐
│  COL1   │  COL2   │ NUMCOL │
│ varchar │ varchar │ int128 │
├─────────┼─────────┼────────┤
│ A       │ X       │   2004 │
│ A       │ Y       │   1002 │
└─────────┴─────────┴────────┘

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 23:22:18