我有一个包含jsonbdetails的PostgreSQL表.该列的一个字段包含名为ranges的数组,其中每个元素都可以包含十进制值的数据.我需要将所有这些值转换为整数(即,将这些值乘以jsonb)并删除键unit.但是,这些字段也可以为空.该数组可以是任何大小.

我的jsonb个例子:

{
    "ranges": [
        {
            "types": {...},
            "areaRange": {
                "unit": "SQUARE",
                "range": {
                    "to": 25.399999618530273,
                    "from": 24.360000610351562
                }
            }
        },
        {
            "types": {...},
            "areaRange": {
                "unit": "SQUARE",
                "range": {
                    "to": 44.560001373291016,
                    "from": 31.969999313354492
                }
            }
        },
        {
            "types": {...},
            "areaRange": {
                "unit": "SQUARE",
                "range": {
                    "to": null,
                    "from": null
                }
            }
        },
        {
            "areaRange": {
                "unit": "SQUARE",
                "range": null
            }
        },
        {
            "areaRange": null
        }
    ],
    "...": {...}
}

我编写了一个取值为to的查询,但它取回的是索引为0的数组中的一个特定元素.可以循环遍历数组的所有元素吗?如何立即更改此值?现在,在我的请求中,我只是得到了它.也许有更好的方法来解决我的问题?

select details -> 'ranges' -> 0 -> 'areaRange' -> 'range' -> 'to'
from table_name
where details -> 'ranges' -> 0 -> 'areaRange' -> 'range' -> 'to' is not null

四舍五入并乘以100的函数:

SELECT round( CAST(float8 '99.69999694824219' as numeric), 2) * 100; -- 9970

推荐答案

要遍历数组的所有元素并更新主题的一些元素,我们可以使用jsonb_array_elementsjsonb_set.

jsonb_array_elements可将JSON对象数组扩展为一组对象.然后,这些对象将由jsonb_set逐个处理和更新,然后使用聚合函数json_agg进行分组,该聚合函数json_agg将记录值聚合为JSON.

UPDATE table_name t
SET details = jsonb_set(t.details::jsonb, '{ranges}', s.range_updated::jsonb)
FROM (
  SELECT details,
  jsonb_agg(
     jsonb_set(ranges::jsonb, '{areaRange,range,to}', 
      (round( CAST(ranges->'areaRange'->'range'->>'to' as numeric), 2) * 100)::varchar::jsonb
    )
  ) as range_updated
  FROM table_name ,
    jsonb_array_elements(details -> 'ranges') as ranges
  GROUP BY details
) s
WHERE t.details = s.details ;

Demo here

Postgresql相关问答推荐

PostgreSQL散列连接与嵌套循环和散列索引

如何使用docker/docker-compose转到本地主机?

无法在timscaleDb中创建Hypertable

忽略 split_part 的第 n 个分隔符之后

EF Core和npgsql连接池已被耗尽

PostgreSQL - 列出模式中的所有唯一约束

从网址获取第一个字符串

使用 postgresql Select 整数作为位和状态表

如何在 PSQL 中查找从另一个表继承的子表

表或列名不能以数字开头?

Select 空字段

从time without time zone和时区名称中获取time with time zone

使用 pg-promise 插入多条记录

将属性添加到 Sequelize FindOne 返回的对象

你如何在postgresql中做mysqldump?

安装了 Postgres.app 但它不起作用

判断 PostgreSQL 中的角色是否设置了密码

psql 将默认 statement_timeout 设置为 postgres 中的用户

postgresql中的移动平均线

Django 中的唯一模型字段和区分大小写(postgres)