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

PostgreSQL 11.5中如何从jsonb数据提取月份年份并拼接为年月格式

解决方案

你当前写法的核心问题是没有保留原始books表的行ID,将所有JSON数组展开后的年月值混在了一起,无法将同一条记录的月份和年份对应拼接。
可以直接按原始行ID分组,使用string_agg聚合拼接年月值,参考SQL如下:

SELECT 
  b.id,
  string_agg(
    elem ->> 'value', 
    '-' 
    ORDER BY CASE elem ->> 'name' 
              WHEN '$.publishedMonth' THEN 1 
              WHEN '$.publishedYear' THEN 2 
            END
  ) AS publishedMonthYear
FROM books b
CROSS JOIN jsonb_array_elements(b.result) elem
WHERE 
  b.bookstore_id = '3'
  AND elem ->> 'name' IN ('$.publishedMonth', '$.publishedYear')
GROUP BY b.id
-- 可选:过滤掉缺少年份/月份的异常记录
-- HAVING COUNT(*) = 2
ORDER BY b.id;

逻辑说明

  • 用CROSS JOIN jsonb_array_elements展开每条记录的resultJSONB数组,全程保留原始记录的id字段
  • 过滤只保留月份、年份两个目标字段
  • 按原始记录id分组,用string_agg按「月份在前、年份在后」的固定顺序拼接两个值,得到目标格式
    如果你的业务场景中每条result数组内固定只包含年月两个字段,也可以简化ORDER BY逻辑,直接按elem ->> 'name'排序即可,因为$.publishedMonth字典序天然早于$.publishedYear。

内容的提问来源于stack exchange,提问作者Xux.rd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:36:00