как обновить полуструктурированные данные в снежинке? - PullRequest
1 голос
/ 06 марта 2020

Мы храним достаточное количество значений / пар в объекте json в столбце снежинки. Количество значений / пар не задано заранее (следовательно, полуструктурированные данные)

Каковы мои варианты обновления одной из пар значений?

Должен ли я извлечь все JSON, преобразовать его в строку, изменить строку и полностью обновить столбец объекта?

Или есть небольшая приятная функция, где я могу обновить только те пары, которые я хочу?

create or replace table TB as
select $1 TB_ID, parse_json($2) my_json
from values
(1, '{ "FruitShape":"Round", "FruitSize":55 } '),
(2, '{ "FruitShape":"Square"  } '),
(3, '{ "FruitShape":"Oblong", "FruitSize":22, "FruitColor":"Chartreuse" })
;

Это создало 3 строки с максимум 3 значениями / парами на строку.

Допустим, я хочу изменить свойство в первом ряду с "круглого" на "квадратное"

UPDATE TB
  SET my_json = parse_json('{ "FruitShape":"square", "FruitSize":55 }')
  WHERE TB_ID = 1;

Это то, что я должен делать?

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Вы можете сделать это с javascript UDF. Например:

create or replace function merge_objects("a" object, "b" object)
returns object
language javascript
as
$$ 
    return {...a, ...b} 
$$;

И позвоните так:

select merge_objects(
  object_construct('a',1,'b',2), 
  object_construct('b',3,'c',4)
);

select merge_objects(
  parse_json('{"a":1,"b":[1,2,3]}')::object, 
  parse_json('{"c":2,"b":[2,3,4]}')::object
);
0 голосов
/ 06 марта 2020

Вы не должны пытаться обновить, просто добавьте новую строку и затем используйте представление для доступа к текущим значениям.

...