Выгрузка postgres jsonb на основе нескольких свойств в поле jsonb - PullRequest
2 голосов
/ 04 октября 2019

Я пытаюсь перейти в таблицу с полем jsonb на основе нескольких свойств json в поле jsonb, используя запрос ниже

insert into testtable(data) values('{
    "key": "Key",
    "id": "350B79AD",
    "value": "Custom"
}')
On conflict(data ->>'key',data ->>'id')
do update set data =data || '{"value":"Custom"}'
WHERE data ->> 'key' ='Key' and data ->> 'appid'='350B79AD'

Вышеприведенный запрос выдает ошибку, как показано ниже

ERROR:  syntax error at or near "->>"
LINE 8: On conflict(data ->>'key',data ->>'id')

я что-то упускаю здесь очевидное?

1 Ответ

1 голос
/ 08 октября 2019

Полагаю, вы хотите вставить в таблицу уникальные комбинации id и key. Затем вам нужно уникальное ограничение для них:

create unique index on testtable ( (data->>'key'), (data->>'id') );

, а также использовать дополнительные скобки для предложения on conflict в качестве кортежа:

on conflict( (data->>'key'), (data->>'id') )

и квалифицировать имя столбца jsonb (data) по имени таблицы (testtable) всякий раз, когда вы встречаетесь после do update set или после where пунктов как testtable.data. Итак, преобразуйте ваше утверждение в:

insert into testtable(data) values('{
    "key": "Key",
    "id": "350B79AD",
    "value": "Custom1"
}')
    on conflict( (data->>'key'), (data->>'id') )
    do update set data = testtable.data || '{"value":"Custom2"}'
 where testtable.data ->> 'key' ='Key' and testtable.data ->> 'id'='350B79AD';

кстати, data ->> 'appid'='350B79AD' преобразовано to data ->> 'id'='350B79AD' (appid -> id)

Демо

...