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

PostgreSQL 10如何更新存储JSON结构的text字段,为null的earliestDate2赋值数组首个日期

PostgreSQL 10 对应更新语句实现

假设存储JSON结构的text字段名为json_field,所属表名为your_table,请替换为实际业务的真实字段名和表名后使用:

预览验证语句(建议先执行验证结果,避免脏数据)

SELECT 
  json_field AS 原值,
  jsonb_set(
    json_field::jsonb,
    '{earliestDate2}',
    to_jsonb((json_field::jsonb -> 'earliestDate' -> 0 ->> 'date')::text)
  )::text AS 预期更新值
FROM your_table
WHERE 
  -- 仅匹配earliestDate2为null的记录
  (json_field::jsonb ->> 'earliestDate2') IS NULL
  -- 过滤earliestDate为非空数组、且第一个元素存在date值的记录,避免执行异常
  AND jsonb_array_length(json_field::jsonb -> 'earliestDate') > 0
  AND (json_field::jsonb -> 'earliestDate' -> 0 ? 'date');

正式更新语句

UPDATE your_table
SET json_field = jsonb_set(
    json_field::jsonb,
    '{earliestDate2}',
    to_jsonb((json_field::jsonb -> 'earliestDate' -> 0 ->> 'date')::text)
)::text
WHERE 
  (json_field::jsonb ->> 'earliestDate2') IS NULL
  AND jsonb_array_length(json_field::jsonb -> 'earliestDate') > 0
  AND (json_field::jsonb -> 'earliestDate' -> 0 ? 'date');

逻辑说明

  • 由于存储JSON的字段是text类型,需要先强转成jsonb类型才能调用PostgreSQL内置的JSON操作函数,处理完成后再转回text类型存回原字段
  • jsonb_set是JSONB结构的属性修改函数,入参依次为原JSONB对象、要修改的属性路径、新的属性值
  • WHERE条件做了多层校验,避免earliestDate为空数组、第一个元素无date字段的记录执行时报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:54:03