我试图在postgresql中使用json_build_object和json_build_array重新创建这个json
这是我想要的输出:
[
{
"name": "Albert",
"Gender": "Male",
"tags": [
"Student",
"Geography"
]
}
]
这是我的问题:
SELECT
json_build_array(json_build_object(
'tags',jsonb_build_array('Student','Geography'),
'Gender','Male',
'name', 'name'
))
FROM student_list
但是当我运行这个查询时,我首先出现了Gender部分而不是我想要的输出。
以下是运行查询后得到的输出
[
{
"Gender": "Male",
"name": "Albert",
"tags": [
"Student",
"Geography"
]
}
]
我该怎么做才能让它像我想要的输出一样,为什么不遵循我的查询中的顺序。我试图重新排列查询中的语句,但我发现性别总是首先弹出,而不是像我想要的输出。
有人可以告诉我我做错了什么。
答案 0 :(得分:0)
对象是一组无序名称/值对。一个对象开始 用{(左括号)和以}结尾(右括号)。每个名字都是 后跟:(冒号)和名称/值对分开, (逗号)。
所以你不能期望对象中的顺序 - 仅在数组中
当然你总是可以将json视为文本,然后用一些可怕的离合器来命令它,比如{"b":1,"c":4,"a":"foo"}
:
t=# with c(j) as (values('{"b":1,"c":4,"a":"foo"}'::json))
, p as (select json_object_keys(j) k, j->json_object_keys(j) v from c)
, r as (select '{'||string_agg('"'||k||'":'||v,',') over (order by k desc) ||'}' jsn from p)
select jsn from r order by length(jsn) desc limit 1;
jsn
-------------------------
{"c":4,"b":1,"a":"foo"}
(1 row)
有序下降并且:
t=# with c(j) as (values('{"b":1,"c":4,"a":"foo"}'::json))
, p as (select json_object_keys(j) k, j->json_object_keys(j) v from c)
, r as (select '{'||string_agg('"'||k||'":'||v,',') over (order by k asc) ||'}' jsn from p)
select jsn from r order by length(jsn) desc limit 1;
jsn
-------------------------
{"a":"foo","b":1,"c":4}
(1 row)
...升
但是一旦你把它投射到json,对象中的顺序就会失败......