news 2026/5/24 22:59:37

DeepSeek总结的DuckDB动态函数应用插件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek总结的DuckDB动态函数应用插件

来源:https://github.com/teaguesterling/duckdb_func_apply

DuckDB FuncApply 扩展

DuckDB 的动态函数应用 - 在运行时通过名称调用函数。

概述

FuncApply 扩展为 DuckDB 提供了动态函数调用能力,允许您:

  • 使用apply()通过名称调用任何标量函数或宏
  • 使用apply_with()动态传递参数
  • 使用apply_table()apply_table_with()动态调用表函数
  • 使用function_exists()检查函数是否存在

这对于数据驱动的转换、动态 SQL 生成以及构建灵活的数据管道非常有用。

快速开始

-- 加载扩展LOADfunc_apply;-- 动态调用标量函数SELECTapply('upper','hello world');-- 结果: HELLO WORLDSELECTapply('substr','hello world',7,5);-- 结果: world-- 动态调用表函数SELECT*FROMapply_table('range',5);-- 返回: 0, 1, 2, 3, 4SELECT*FROMapply_table('generate_series',1,10,2);-- 返回: 1, 3, 5, 7, 9-- 在调用前检查函数是否存在SELECTfunction_exists('my_custom_func');-- 结果: true/false

函数

apply(func_name, ...args)

使用提供的参数通过名称调用一个函数。

-- 字符串函数SELECTapply('upper','hello');-- HELLOSELECTapply('concat','a','b','c');-- abcSELECTapply('substr','hello',2,3);-- ell-- 数值函数SELECTapply('abs',-42);-- 42SELECTapply('round',3.14159,2);-- 3.14-- 列表函数(宏)SELECTapply('list_sum',[1,2,3,4]);-- 10SELECTapply('list_reverse',[1,2,3]);-- [3, 2, 1]-- 支持命名参数SELECTapply('substr','hello world',start:=7,length :=5);-- world

apply_with(func_name, args, kwargs)

使用作为列表提供的参数调用一个函数。

-- 基本用法SELECTapply_with('upper',args :=['hello']);-- 结果: HELLO-- 使用位置语法SELECTapply_with('concat',['a','b','c'],NULL);-- 结果: abc

注意:DuckDB 列表必须是同质的(相同类型)。对于混合类型的参数,请直接使用apply()

apply_table(func_name, ...args)

通过名称调用一个表函数,并将其结果作为表返回。

-- 基本范围SELECT*FROMapply_table('range',5);-- 返回: 0, 1, 2, 3, 4-- 带步长的生成序列SELECT*FROMapply_table('generate_series',1,10,2);-- 返回: 1, 3, 5, 7, 9-- 在连接中使用SELECTd.*,r.rangeasidxFROMmy_data dCROSSJOINapply_table('range',3)r;-- 在子查询中使用SELECT*FROMmy_tableWHEREidIN(SELECTrangeFROMapply_table('range',100));

apply_table_with(func_name, args, kwargs)

使用作为列表提供的参数和可选的命名参数调用一个表函数。

-- 基本用法SELECT*FROMapply_table_with('range',args :=[5]);-- 返回: 0, 1, 2, 3, 4-- 使用命名参数SELECT*FROMapply_table_with('generate_series',args :=[1],kwargs :={stop:10,step:2});-- 返回: 1, 3, 5, 7, 9

function_exists(name)

如果存在具有给定名称的函数,则返回 true。

SELECTfunction_exists('upper');-- trueSELECTfunction_exists('nonexistent');-- false-- 用于条件逻辑SELECTCASEWHENfunction_exists(func_name)THENapply(func_name,value)ELSE'N/A'ENDFROMmy_table;

支持的函数类型

类型是否支持使用的函数示例
标量函数apply,apply_withupper,abs,substr
apply,apply_withlist_sum,list_reverse
表函数apply_table,apply_table_withrange,generate_series
聚合函数不适用sum,avg

用例

数据驱动的转换

-- 在表中存储转换规则CREATETABLEtransforms(column_nameVARCHAR,func_nameVARCHAR);INSERTINTOtransformsVALUES('name','upper'),('email','lower'),('phone','trim');-- 动态应用转换SELECTapply(t.func_name,d.value)asresultFROMdatadJOINtransforms tONd.column=t.column_name;

动态函数选择

-- 根据数据类型选择函数SELECTapply(CASEtypeof(value)WHEN'VARCHAR'THEN'upper'WHEN'INTEGER'THEN'abs'ELSE'to_string'END,value)FROMmy_table;

执行前验证

-- 仅调用存在的函数SELECTfunc_name,CASEWHENfunction_exists(func_name)THENapply(func_name,'test')ELSE'Function not found'ENDasresultFROMfunction_list;

动态表生成

-- 根据配置生成动态行数SELECT*FROMapply_table('range',row_count)WHERErow_count=(SELECTmax_rowsFROMconfig);-- 在交叉连接中使用表函数进行数据扩展SELECTd.*,idx.rangeaspositionFROMmy_data dCROSSJOINapply_table('range',d.repeat_count)idx;

构建

先决条件

DuckDB 扩展使用 VCPKG 进行依赖管理:

gitclone https://github.com/Microsoft/vcpkg.git ./vcpkg/bootstrap-vcpkg.shexportVCPKG_TOOLCHAIN_PATH=`pwd`/vcpkg/scripts/buildsystems/vcpkg.cmake

构建

make

测试

maketest

安装

从源码构建

构建后,扩展位于:

./build/release/extension/func_apply/func_apply.duckdb_extension

在 DuckDB 中加载它:

LOAD'path/to/func_apply.duckdb_extension';

未签名扩展

要加载未签名的扩展,请使用以下方式启动 DuckDB:

duckdb-unsigned

或者在 Python 中:

con=duckdb.connect(':memory:',config={'allow_unsigned_extensions':'true'})

文档

请参阅 docs/ 文件夹获取详细文档:

  • API 参考 - 完整的函数参考
  • 示例 - 使用示例和模式
  • 内部实现 - 实现细节

许可证

MIT 许可证 - 详情请参阅 LICENSE 文件。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/24 22:59:36

DeepSeek总结的clickhousectl v0.2.0: Postgres, ClickPipes 等更多功能

来源:https://clickhouse.com/blog/clickhousectl-v0-2-0-postgres-clickpipes-more clickhousectl v0.2.0: Postgres, ClickPipes 等更多功能 作者: Al Brown 日期: 2026年5月20日 阅读时间: 7分钟 我们发布了 clickhousectl v0.2.0。此版本增加了对 Postgres&…

作者头像 李华
网站建设 2026/5/24 22:51:07

【教育科技爆款内容生产核心】:用ChatGPT批量生成带答案解析+难度分级+认知维度标签的脑筋急转弯(附可商用JSON Schema)

更多请点击: https://kaifayun.com 第一章:教育科技爆款内容生产的底层逻辑重构 教育科技领域的“爆款”并非偶然产物,而是内容价值、用户认知路径与算法分发机制三者深度耦合的结果。传统以课程大纲为中心的线性生产范式,正被“…

作者头像 李华
网站建设 2026/5/24 22:37:56

论文初稿被批太水?青年教师力荐这几个AI论文写作软件

想写论文又快又好,关键是用对 AI 工具、走对流程——资深教授普遍推荐:千笔AI(中文全流程首选) 豆包学术版(轻量高效) DeepSeek 学术版(理工 / 长文本) Grammarly Academic&#xff…

作者头像 李华
网站建设 2026/5/24 22:22:38

卖轴承怎么找客户?下游工厂在哪里

卖轴承找客户,本质是找用轴承的下游工厂,核心难点是拿到这些下游厂的名单和联系人。轴承是机械传动的通用基础件,消耗量大、采购频繁,但下游行业分散、各自聚集在不同产业带,如果没有系统盘过下游版图,销售…

作者头像 李华
网站建设 2026/5/24 22:04:15

3个场景告诉你:为什么你需要PowerToys Text Extractor

3个场景告诉你:为什么你需要PowerToys Text Extractor 【免费下载链接】PowerToys Microsoft PowerToys is a collection of utilities that supercharge productivity and customization on Windows 项目地址: https://gitcode.com/GitHub_Trending/po/PowerToys…

作者头像 李华
网站建设 2026/5/24 22:04:00

独立开发者如何借助Taotoken的Token Plan套餐有效控制AI实验成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何借助Taotoken的Token Plan套餐有效控制AI实验成本 对于独立开发者或研究者而言,在构建AI应用原型或进行…

作者头像 李华