更新JSONB列,其中JSONB列具有特定值postgreSQL
我在Postgres DB中有一个名为更新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" ] } 我迄
guest\u group
的表和一个名为custom\u fields
的列,其中包含以下值:(示例)
我想用
等于值
,其中芭芭拉夫人测试
数组等于服务标签
[“全名”]
- 加上
等于值
,其中118
数组等于服务标签
[“房间号”]
{
"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 …