丑陋的车轮,但没有比它更聪明的车轮来得快:
with c(jb) as (values('{
"date": "2018-02-12",
"author": "devoplex",
"block": [
{ "color": "#C70039", "title": "Fruit" },
{ "color": "#DAF7A6", "title": "Vegetable" },
{ "color": "#DAF7A6", "title": "Meat" }
]
}'::jsonb))
, m as (select jb,e,case when o <3 then o else o+1 end o from c, jsonb_array_elements(jb->'block') with ordinality t(e,o) union all select jb, '{ "color": "#581845", "title": "Candy" }',3 from c)
, n as (select distinct jb,jsonb_agg(e) over (order by o) a from m)
select jsonb_pretty(jsonb_set(jb,'{block}',a)) from n order by length(a::text) desc limit 1;
jsonb_pretty
----------------------------------
{ +
"date": "2018-02-12", +
"block": [ +
{ +
"color": "#C70039", +
"title": "Fruit" +
}, +
{ +
"color": "#DAF7A6", +
"title": "Vegetable"+
}, +
{ +
"color": "#581845", +
"title": "Candy" +
}, +
{ +
"color": "#DAF7A6", +
"title": "Meat" +
} +
], +
"author": "devoplex" +
}
当然你应该更换
3
如果你想在其他索引中使用其他数字。。。
http://dbfiddle.uk/?rdbms=postgres_10&fiddle=ccef24ef615b30eec07be9d1be5a1f8d
下面是从主查询中提取索引以指示CTE的示例