Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何在jsonb字段中查找数组元素?_Postgresql_Sql Update_Jsonb_Postgresql 10 - Fatal编程技术网

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 ;
  

与此基本相同:您需要将尾部零件转换为或