Postgresql 如何在jsonb字段中查找数组元素?
假设我有一张桌子:Postgresql 如何在jsonb字段中查找数组元素?,postgresql,sql-update,jsonb,postgresql-10,Postgresql,Sql Update,Jsonb,Postgresql 10,假设我有一张桌子: SELECT * FROM settings; | id | name | strategies | | -- | --- | --- | | 1 | default | [{name: xyz, enabled: true}, {name: bot, enabled: true}] | | 2 | new1 | [{name: bot, enabled: true}, {name: xyz, enabled: false}] | s
SELECT * FROM settings;
| id | name | strategies |
| -- | --- | --- |
| 1 | default | [{name: xyz, enabled: true}, {name: bot, enabled: true}] |
| 2 | new1 | [{name: bot, enabled: true}, {name: xyz, enabled: false}] |
strategies
这里是一个jsonb类型的字段(一个对象数组)
我想更改策略列(数组)中一个元素(对象)中一个属性的值,即将“bot”重命名为“bot2”
我想我可以通过以下方式做到:
-- renames strategy bot to bot2 using fixed index
UPDATE settings
SET strategies = jsonb_set(strategies, '{1}', '{
"name": "bot2",
"enabled": true,
}', FALSE)
WHERE name = 'default';
但我不喜欢它对数组索引使用幻数({1}
)
如果我不知道要编辑的数组元素的索引(或者如果所有记录的索引都不相同),该怎么办?如何根据jsonb字段的属性对其数组元素执行查找,即查找
name='bot'
?我使用的是PostgreSQL v10.5。因为您希望首先获取元素的路径,然后更新它
您可以尝试以下方法:
with cte as (
select ('{'||index-1||',name}')::text[] as json_path
from settings, jsonb_array_elements(strategies)
with ordinality arr(strategy,index) where strategy->>'name'='bot'
)
update settings
set strategies = jsonb_set(strategies,cte.json_path,'"bot2"',false)
from cte ;
与此基本相同:您需要将尾部零件转换为或