XÓA hoạt động trên các hàng của bảng. Do đó, bạn không thể sử dụng nó trừ khi bạn muốn xóa hàng hoàn chỉnh.
Hãy thử điều này:
create temp table testing as
select
'{ "playersContainer": {
"players": [
{
"id": "1",
"name": "Nick"
},
{
"id": "2",
"name": "Rick"
},
{
"id": "3",
"name": "Trick"
}
]
}}'::jsonb as value;
Bây giờ bạn cần tìm vị trí của người chơi bạn muốn xóa, giả sử bạn muốn Rick với id 2 (trừ 1 vì chỉ số bắt đầu từ 0)
select position-1 from testing, jsonb_array_elements(value->'playersContainer'->'players') with ordinality arr(elem, position) WHERE elem->>'id' = '2';
Bây giờ bạn có thể kết hợp nó với một UPDATE
câu lệnh để cập nhật trường. Sử dụng toán tử dấu trừ (-) để xóa phần tử ở chỉ mục mong muốn.
UPDATE testing SET value = jsonb_set(value, '{playersContainer,players}', (value->'playersContainer'->'players') - (select position-1 from testing, jsonb_array_elements(value->'playersContainer'->'players') with ordinality arr(elem, position) WHERE elem->>'id' = '2')::int );
Kết quả cuối cùng:
{
"playersContainer":{
"players":[
{
"id":"1",
"name":"Nick"
},
{
"id":"3",
"name":"Trick"
}
]
}
}