在Postgresql

时间:2018-01-12 02:28:59

标签: sql arrays json postgresql sorting

我试图在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"
    ]
  }
]

我该怎么做才能让它像我想要的输出一样,为什么不遵循我的查询中的顺序。我试图重新排列查询中的语句,但我发现性别总是首先弹出,而不是像我想要的输出。

有人可以告诉我我做错了什么。

1 个答案:

答案 0 :(得分:0)

https://www.json.org/

  

对象是一组无序名称/值对。一个对象开始   用{(左括号)和以}结尾(右括号)。每个名字都是   后跟:(冒号)和名称/值对分开,   (逗号)。

所以你不能期望对象中的顺序 - 仅在数组中

当然你总是可以将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,对象中的顺序就会失败......