Postgres从JSONB更新INTEGER列

时间:2019-03-27 01:22:50

标签: sql postgresql jsonb

我有一张桌子cart

 id     | value |     metadata
--------+-------+-------------------
  45417 |     0 | {"value": "1300"}
  45418 |     0 | {"value": "1300"}
 276021 |     0 | {"value": "1300"}

,并且我尝试使用JSONB value中的值更新metadata列(如果存在)。我提出以下查询:

UPDATE cart SET value=CAST(subquery.meta_val as INTEGER) FROM
(SELECT id, metadata->>'value' as meta_val FROM cart
WHERE value = 0 AND 
metadata->>'value' IS NOT NULL) as subquery
WHERE cart.id=subquery.id;

现在这可行,但是要在生产中更新4M行需要花费大量时间,在我看来查询中有很多冗余。

我认为下一步是将所有这些内容包装在事务中并改进查询,是否可以做些事情来提高此查询的性能?

1 个答案:

答案 0 :(得分:1)

尝试不带子查询。

update cart as c
set value = coalesce((c.metadata->>'value')::int, 0)