我有一个简单的JSON数组:
_bb jsonb =
[
{
"so": "1",
"mdl": "Testing",
"pos": "Top"
},
{
"so": "1",
"mdl": "FlashSale",
"pos": "Bottom"
},
{
"so": "1",
"mdl": "Testing",
"pos": "Top"
}
]
我想要实现的目标:
[
{
"so": "1",
"mdl": "Testing",
"pos": "Top"
},
{
"so": "1",
"mdl": "Testing",
"pos": "Top"
},
{
"so": "1",
"mdl": "FlashSale",
"pos": "Bottom"
}
]
我试过
Select _bb into _test ORDER BY _bb->>'pos' ASC ;
我所取得的就是pos =" Top"成为JSON中的第一个和所有"底部"是最后的。有没有办法在Postgres实现这个目标?
答案 0 :(得分:3)
with j(_bb) as (values('[
{
"so": "1",
"mdl": "Testing",
"pos": "Top"
},
{
"so": "1",
"mdl": "FlashSale",
"pos": "Bottom"
},
{
"so": "1",
"mdl": "Testing",
"pos": "Top"
}
]'::jsonb))
, ord(o,v) as (values(1,'Top'),(2,'Bottom'))
, un as (select *,jsonb_array_elements(_bb) i from j)
select jsonb_agg(i order by o) from un
join ord on v=i->>'pos'
;
结果为:
[
{
"so": "1",
"mdl": "Testing",
"pos": "Top"
},
{
"so": "1",
"mdl": "Testing",
"pos": "Top"
},
{
"so": "1",
"mdl": "FlashSale",
"pos": "Bottom"
}
]
不用说你必须为所有值建立订单矩阵,例如:
, ord(o,v) as (values(1,'Top'),(2,'Middle'),(3,'Bottom'))