У меня есть массив JSON, я хочу добавить запись, и эту запись следует удалить из массива JSON.

Например, массив:

SET @os ='[
{
    "id": "66",
    "date_end": "2022-01-09 18:00:00",
    "occupied": "1",
    "date_begin": "2022-01-09 17:30:00",
    "idCategory": "[1,2,3]",
    "date_requested": "2022-01-02 14:59:27"
},
{
    "id": "39",
    "date_end": "2022-01-03 11:30:00",
    "occupied": "1",
    "date_begin": "2022-01-03 08:00:00",
    "idCategory": "3",
    "date_requested": "2022-01-01 22:40:58"
}
]';

И запись, которую я хочу удалить:

SET @test ='
{
    "id": "39",
    "date_end": "2022-01-03 11:30:00",
    "occupied": "1",
    "date_begin": "2022-01-03 08:00:00",
    "idCategory": "3",
    "date_requested": "2022-01-01 22:40:58"
}';

Мой код выглядит примерно так:

SET @new_os = (select json_arrayagg(js) from json_table(@os, '$[*]' columns ( js json path '$')) as jt 
    where json_extract(js, '$.date_end') <> json_extract(@test, '$.date_end') and json_extract(js, '$.id') <> json_extract(@test, '$.id') 
    and json_extract(js, '$.date_begin') <> json_extract(@test, '$.date_begin') and json_extract(js, '$.date_requested') <> json_extract(@test, '$.date_requested') 
    and json_extract(js, '$.idCategory') <> json_extract(@test, '$.idCategory') and json_extract(js, '$.occupied') <> json_extract(@test, '$.occupied'));

SELECT @os,@new_os;

Но в итоге я получаю, что @new_os равно NULL, и должно быть так:

[
{
    "id": "66",
    "date_end": "2022-01-09 18:00:00",
    "occupied": "1",
    "date_begin": "2022-01-09 17:30:00",
    "idCategory": "[1,2,3]",
    "date_requested": "2022-01-02 14:59:27"
}]
1
Bruno 26 Янв 2022 в 13:59

1 ответ

Лучший ответ

Вместо фильтрации несовпадающих столбцов json
это может быть фильтрация совпадений столбцов.

SET @new_os = (
select json_pretty(json_arrayagg(os.js)) as new_os
from json_table(@os, '$[*]' columns (js json path '$')) as os
where not exists (
  select 1
  from json_table(@test, '$' columns ( js json path '$')) as tst
  where json_extract(os.js, '$.id') = json_extract(tst.js, '$.id')
    and json_extract(os.js, '$.date_end') = json_extract(tst.js, '$.date_end')
    and json_extract(os.js, '$.date_begin') = json_extract(tst.js, '$.date_begin')
    and json_extract(os.js, '$.date_requested') = json_extract(tst.js, '$.date_requested')
    and json_extract(os.js, '$.idCategory') = json_extract(tst.js, '$.idCategory')
    and json_extract(os.js, '$.occupied') = json_extract(tst.js, '$.occupied')
));

SELECT @os, @new_os;

Демонстрация db<>fiddle здесь

1
LukStorms 26 Янв 2022 в 14:54