我有一个数据类型为 json 的“数据”列,它可能是空的
{ }
或者可能已经包含一些键:
{ "category": "alpha", "verified": true }
我想要一个 notes
键,它将是一个文本数组。如果它不存在,UPDATE
查询应该使用提供的文本创建它,否则它应该添加它(索引位置在追加时无关紧要)。
总会有一个音符被添加到
notes
键。
目前,我是这样做的:
SELECT data::jsonb ? 'notes' FROM my_table WHERE id = 1;
如果为假,我创建密钥并提供第一个值:
UPDATE my_table
SET data = jsonb_set(coalesce(data::jsonb,'{}'), '{notes}', '["Add"]'::jsonb)
WHERE id = 1;
如果它存在,我追加到同一个数组:
UPDATE my_table
SET data = jsonb_set(data::jsonb, array['notes'], (data->'notes')::jsonb || '["Update"]'::jsonb)
WHERE id = 1;
这可以在一次操作中完成吗?我最终将编写一个函数来更新该表的其他列并根据需要添加/更新注释。