[英]How do I select and update a JSON array element in Postgresql?
我正在使用9.6版本。 我的文档看起来像这样:
{
"name" : "John Doe",
"phones" : [
{
"type" : "mobile",
"number" : "555-555-0000",
"deleted": false
},
{
"type" : "home",
"number" : "555-555-0001",
"needsUpdated" : true
},
{
"type" : "work",
"number" : "555-555-0002"
}
]
}
我创建了这样的:
create table t_json (c_json json not null);
insert into t_json (c_json) values ('{"name":"John Doe","phones": [{"type":"mobile","number":"555-555-0000"},{"type":"home","number":"555-555-0001"},{"type": "work","number": "555-555-0002"}]}');
insert into t_json (c_json) values ('{"name":"Jane Dane","phones": [{"type":"mobile","number":"555-555-0030"},{"type":"home","number":"555-555-0020"},{"type": "work","number": "555-555-0010"}]}');
现在我想弄清楚如何A
,选择名为John Doe的行,并将他的手机号码更新为“555-555-0003”。
从这里Postgresql 9.6文档我发现我可以查询正确的文档,如下所示:
select c_json from t_json where c_json->>'name' = 'John Doe';
但我没有看到如何按类型选择手机阵列中的正确子文档,并更新数值。 谁能帮我吗?
编辑
我需要假设子文档有额外的值并且不一致。 所以我在上面添加了一些。 我非常确定此时无法在没有数据丢失的情况下进行此更新。
如何按类型在手机阵列中选择正确的子文档?
如果您想获取电话号码,请使用此号码。 相应的文件是https://www.postgresql.org/docs/9.6/static/queries-table-expressions.html#QUERIES-LATERAL
SELECT c_json ->> 'name', phones.type, phones.number
FROM t_json
CROSS JOIN json_to_recordset(c_json -> 'phones')
AS phones("type" TEXT, "number" TEXT);
如果您想通过电话号码搜索,这可以:
SELECT * FROM t_json
WHERE (c_json -> 'phones')::JSONB @>
'[{"type":"mobile","number":"555-555-0000"}]'::JSONB;
如何更新数值?
正如评论中提到的,有一个类似的问题, 如何修改新的PostgreSQL JSON数据类型中的字段?
还有其他方法可以做到这一点,比如
UPDATE t_json SET c_json = newvalue FROM (
SELECT to_json(updated) AS newvalue FROM (
SELECT c_json ->> 'name' as "name",
json_agg(json_build_object('type', phones.type, 'number',
CASE phones.type WHEN 'mobile' THEN '555-555-0003' ELSE phones.number END)
) AS phones
FROM t_json
CROSS JOIN json_to_recordset(c_json -> 'phones')
AS phones("type" TEXT, "number" TEXT)
WHERE c_json->>'name' = 'John Doe'
GROUP BY name
) as updated
) AS sub WHERE c_json ->> 'name' = 'John Doe';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.