我使用postgres 12。X,我有以下日志表:-
logs
id bigint,jsondata文本
以下是json
中的值[
{
"loginfo": "somelog1",
"id": "app1"
},
{
"loginfo": "somelog2",
"id": "app2"
}
]
我需要删除所有json对象从这个文本列id == "app2">
尝试了以下答案:- https://dba.stackexchange.com/questions/84472/how-to-remove-object-from-json-array
UPDATE logs i SET jsondata = i2.jsondata FROM (SELECT id, array_to_json(array_agg(elem)) AS jsondata
FROM logs cand
, json_array_elements(cand.jsondata) elem
WHERE cand.jsondata @> '{[{"id":"app2"}]}'::jsonb
AND elem->>'id' <> 'app2'
GROUP BY 1 ) i2
WHERE i2.id = i.id;
但是ERROR出现在下面:-
错误:函数json_array_elements(text)不存在
demo:db<>fiddle
为什么要在text
列中存储JSON对象?在这种情况下,您需要在将其作为JSON使用之前对其进行强制转换:
SELECT
id,
json_agg(elems) -- 3
FROM mytable,
json_array_elements(jsondata::json) as elems -- 1
WHERE elems ->> 'id' <> 'app2' -- 2
GROUP BY id
- 将文本转换为JSON;将JSON数组提取为每个元素的记录
- 筛选所需对象
- 将剩余的元素重新聚合到一个新的JSON数组