JSON存放在数据库的文本列里,不必为了处理它而先导出文件、再读回来。DuckDB News于2026年10月16日刊文,介绍直接在SQL中处理这类数据的方法,涉及字段提取和结构推断。
DuckDB的read_json可以读取JSON文件,通过扫描部分数据推断结构,并生成带类型的列。但文章讨论的对象是另一种常见情况:JSON已经存在于文本列中,例如Postgres表里的事件载荷、采集任务保存的API响应,或CSV导出文件中的元数据列。
文章以一张事件表为例,JSON载荷存放在VARCHAR类型的payload列中。三条记录的键并不一致:只有第二条有duration_ms,只有第三条有items,而第三条缺少user中的country。这让示例同时涵盖了可选字段和嵌套数据。
如果只需要少量字段,文章给出两种提取运算符:->返回JSON,->>返回VARCHAR,两者都接受键名或JSON路径。示例用->>读取国家、动作和时长,再把时长转换为INTEGER;缺失的键返回NULL。不过,文章指出,这种方式每提取一个字段都会再次解析JSON,需要的列多了,SQL也会变得冗长。
结构推断则提供了另一层处理能力:json_structure返回单个JSON值的结构,其聚合版本json_group_structure把一列中所有值的结构合并为一个。对于示例中键不完全相同的事件数据,这一步关注的是整列包含哪些结构,而不只是逐个取出已指定的字段。
