如何控制 jsonb_object_agg 中字段的顺序

Ada*_*mAL 3 postgresql aggregate-functions postgresql-10

我正在尝试构建一个 jsonb 对象,其键按字母顺序排列。然而,它似乎jsonb_object_agg(k, v)忽略了输入的顺序,并按密钥长度对输入进行排序,然后按字母顺序排序。

例如

select jsonb_object_agg(k, v order by k) from (
    values ('b', 'b_something'), ('ab', 'ab_something')
) as t (k,v)
Run Code Online (Sandbox Code Playgroud)

给出

{
  "b": "b_something",
  "ab": "ab_something"
}
Run Code Online (Sandbox Code Playgroud)

但我需要的是

{
  "ab": "ab_something"
  "b": "b_something",
}
Run Code Online (Sandbox Code Playgroud)

有办法实现这一点吗?

上下文 我正在展平一个 json 列,其中的内容遵循统一但笨重的模式。由于这个有用的答案,我已经成功地做到了这一点,但是按键的顺序并不是我需要它们的方式。

Lau*_*lbe 7

jsonb以解析的形式存储数据,从而提高访问其各部分的效率。因此,原始字符串的格式不会保留,属性的顺序也不会保留,也不可能有重复的属性。所以你所要求的是不可能的。

您可以使用json数据类型,它本质上是一个带有语法检查的字符串,可保留原始顺序。

要在聚合期间建立顺序,请使用json_agg(... ORDER BY ...)