postgresql 利用当前值更新JSONB的值

ar7v8xwq  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(131)

我有一个包含id列和profile字段的数据库,其中profile字段的类型为jsonb
| 标识符|配置文件字段|
| - -|- -|
| 一百零一|{“1”:“国际象棋”,“2”:“2001年2月8日”}|
| 一百零二|{“1”:“曲棍球”,“2”:“1996年6月9日”}|
在个人资料字段中,关键字2代表出生日期。
遗憾的是,许多字段的值格式为yyyy/mm/dd。
我想以dd/mm/yyyy格式更改所有出生日期值。
预期结果是这样的
| 标题1|标题2|
| - -|- -|
| 一百零一|{“1”:“国际象棋”,“2”:“2001年2月8日”}|
| 一百零二|{“1”:“曲棍球”,“2”:“1996年6月9日”}|
我试着更新更新语句,但我卡住了,我怎么能在多个值中应用?什么将进入where语句。以及如何访问关键字2 profile_fields-〉“2”不在更新语句中。

  • 谢谢-谢谢
cwtwac6a

cwtwac6a1#

您可以执行regexp_replace以在匹配到无效日期时间格式时改变日期时间格式:

update tbl t set profile_fields = (select jsonb_object_agg(t1.key, regexp_replace(
     case when regexp_match(t1.value::text, '\d{4}\-\d{2}-\d{2}') is null 
         then t1.value::text 
         else regexp_replace(t1.value::text, '(\d{4})\-(\d{2})\-(\d{2})', '\3-\2-\1') end, '"', '', 'g')) 
   from jsonb_each(t.profile_fields) t1)

See fiddle

iovurdzv

iovurdzv2#

这里使用||运算符和regexp_replace来重新调整日期格式。

update the_table
set profile_fields = profile_fields || jsonb_build_object
 ('2', regexp_replace(profile_fields->>'2','(\d\d\d\d)-(\d\d)-(\d\d)','\3-\2-\1'))
where profile_fields->>'2' ~ '\d\d\d\d-\d\d-\d\d';

DB Fiddle
请注意,这种方法(使用||运算符)仅适用于第一级键或“平面”JSON。

相关问题