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

SQLite使用JSON_ARRAYAGG聚合数据格式问题求助

在SQLite中实现分类与关联产品的嵌套JSON查询

完全不用换数据库,解决方法分两种情况,取决于你使用的SQLite版本:

情况1:SQLite版本 ≥ 3.38.0

这个版本开始原生支持JSON_ARRAYAGG函数,直接结合JSON_OBJECT就能生成嵌套的JSON数组结构。

假设你有categories(分类表)和products(产品表),关联字段为category_id,查询语句如下:

SELECT
  c.id AS category_id,
  c.name AS category_name,
  -- 用JSON_OBJECT把单个产品转为JSON对象,再用JSON_ARRAYAGG聚合为数组
  IFNULL(
    JSON_ARRAYAGG(
      JSON_OBJECT(
        'product_id', p.id,
        'product_name', p.name,
        'price', p.price
        -- 按需添加其他产品字段
      )
    ),
    '[]' -- 处理无关联产品的分类,返回空数组而非NULL
  ) AS products
FROM categories c
LEFT JOIN products p ON c.id = p.category_id
GROUP BY c.id, c.name;

执行后products字段会是标准的JSON数组,每个元素是完整的产品对象,而非字符串集合。

情况2:SQLite版本 < 3.38.0

低版本没有JSON_ARRAYAGG,但可以用json_group_array替代,核心是先把单个产品转成JSON对象,再进行聚合——你之前用json_group_array没得到预期格式,大概率是直接聚合了p.name这类字段值,导致生成的是["产品A", "产品B"]这种字符串数组,而非对象数组。

示例语句:

SELECT
  c.id AS category_id,
  c.name AS category_name,
  IFNULL(
    json_group_array(
      json_object(
        'product_id', p.id,
        'product_name', p.name,
        'price', p.price
      )
    ),
    '[]'
  ) AS products
FROM categories c
LEFT JOIN products p ON c.id = p.category_id
GROUP BY c.id, c.name;

版本检查

不确定自己的SQLite版本?执行这条语句即可查看:

SELECT sqlite_version();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:26:04