Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
更新JSONB列,其中JSONB列具有特定值postgreSQL_Postgresql_Jsonb - Fatal编程技术网

更新JSONB列,其中JSONB列具有特定值postgreSQL

更新JSONB列,其中JSONB列具有特定值postgreSQL,postgresql,jsonb,Postgresql,Jsonb,我在Postgres DB中有一个名为guest\u group的表和一个名为custom\u fields的列,其中包含以下值:(示例) 我想用 值等于芭芭拉夫人测试,其中服务标签数组等于[“全名”] 加上值等于118,其中服务标签数组等于[“房间号”] 更新应向JSONB添加一个新对象: { "value":"likes JSONB", "display_name":"Traces", "servicio_tags":[ "trace" ] } 我迄

我在Postgres DB中有一个名为
guest\u group
的表和一个名为
custom\u fields
的列,其中包含以下值:(示例)

我想用

  • 等于
    芭芭拉夫人测试
    ,其中
    服务标签
    数组等于
    [“全名”]
  • 加上
    等于
    118
    ,其中
    服务标签
    数组等于
    [“房间号”]
更新应向JSONB添加一个新对象:

{
   "value":"likes JSONB",
   "display_name":"Traces",
   "servicio_tags":[
      "trace"
   ]
}
我迄今为止的努力:

UPDATE guest_group 
SET custom_fields = 
jsonb_insert('[{"value": "Frau Barbara Test", "display_name": "Name", "servicio_tags": ["full-name"]}, {"value": "118", "display_name": "Zimmernummer", "servicio_tags": ["room-number"]}]'::jsonb,
'{0}', 
'{"value": "likes JSONB", "display_name": "Traces", "servicio_tags": ["trace"]}'::jsonb, 
true)
 where custom_fields::text like '%"Frau Barbara Test"%'
 and custom_fields::text like '%"118 "%'
此尝试将特定行的列中的值更改为以下值:

[  
   {  
      "value":"Frau Barbara Test",
      "display_name":"Name",
      "servicio_tags":[  
         "full-name"
      ]
   },
   {  
      "value":"likes JSONB",
      "display_name":"Traces",
      "servicio_tags":[  
         "trace"
      ]
   },
   {  
      "value":"118",
      "display_name":"Zimmernummer",
      "servicio_tags":[  
         "room-number"
      ]
   }
]
因此:

   {
      "value":"likes postgreSQL",
      "display_name":"Traces",
      "servicio_tags":[
         "trace"
      ]
   }
迷路了。如何在不丢失这些数据的情况下进行更新?

这似乎可行:

UPDATE guest_group 
SET custom_fields = 
jsonb_insert(custom_fields::jsonb,'{0}','{"value": "likes JSONB", "display_name": "Traces", "servicio_tags": ["trace"]}'::jsonb) 
WHERE custom_fields::text like '%"Frau Barbara Test"%'
AND custom_fields::text like '%"117"%'

我建议不要将JSON作为字符串进行比较。相反,使用。要查找值中包含Mrs.Test的行,例如可以使用
@>
运算符:

WHERE '[{"value": "Frau Barbara Test"}]'::jsonb <@ custom_fields
这比文本比较好得多,但仍然不完全符合您的要求。由于
@
运算符的语义,它会检查标记数组是否包含
“全名”
字符串,而不是将其作为单个元素

要做到这一点,它变得有点复杂,涉及对
jsonb_数组_元素的子查询
,并显式访问其json组件进行比较:

SELECT *
FROM guest_group
WHERE EXISTS(
  SELECT 1
  FROM jsonb_array_elements(custom_fields) AS el
  WHERE el->>'value' = 'Frau Barbara Test'
    AND el->'servicio_tags' = '["full-name"]'::jsonb)
您还可以使用
ANY
将这两种方法混合使用:

SELECT *
FROM guest_group
WHERE '{"value": "Frau Barbara Test"}' <@ ANY(
  SELECT el
  FROM jsonb_array_elements(custom_fields) AS el
  WHERE el->'servicio_tags' = '["full-name"]'::jsonb)

您是否需要
servicio_标签
数组来等于该精确值,还是只需要它来包含相应的字符串(可能包括其他字符串)?
servicio_标签
数组必须等于该精确值。非常感谢!这是一个很好的答案!
SELECT *
FROM guest_group
WHERE EXISTS(
  SELECT 1
  FROM jsonb_array_elements(custom_fields) AS el
  WHERE el->>'value' = 'Frau Barbara Test'
    AND el->'servicio_tags' = '["full-name"]'::jsonb)
SELECT *
FROM guest_group
WHERE '{"value": "Frau Barbara Test"}' <@ ANY(
  SELECT el
  FROM jsonb_array_elements(custom_fields) AS el
  WHERE el->'servicio_tags' = '["full-name"]'::jsonb)
UPDATE guest_group 
SET custom_fields = jsonb_insert(custom_fields, '{0}', '{"value": "likes JSONB", "display_name": "Traces", "servicio_tags": ["trace"]}'::jsonb, true)
WHERE …