在执行SELECT查询时,我需要重新映射postgres中数组的对象中的属性名称.

user_phones具有列idphones.假设phones列类型为json,数组具有以下 struct :

[
  {
    model: "samsung s23 utra",
    serial_number: 123456
  },
  {
    model: "apple i-phone 15",
    serial_number: 123477
  }
]

当我执行select查询时,我希望响应中的phones属性返回为:

[
  {
    model: "samsung s23 utra",
    serialNumber: 123456
  },
  {
    model: "apple i-phone 15",
    serialNumber: 123477
  }
]

我在想大概SELECT p.id, json_build_array(SELECT <this is where I'm stuck>) as p.phones FROM user_phones as p美元左右;

我加了fiddle here

在波斯格雷斯有没有一种简单的方式来实现这一点?

推荐答案

投到text,replace(),回拨到json:Demo at db<>fiddle

select id, replace(phones::text,'"serial_number"','"serialNumber"')::json
from user_phones;
id jsonb_pretty
1 [
    {
        "model": "samsung s23 utra",
        "serialNumber": "12345"
    },
    {
        "model": "iphone15",
        "serialNumber": "12333"
    }
]

它将以任何与模式匹配的内容为目标,而不管它实际上是键还是值,或者是两者中的一部分.从好的方面来说,它更简单、更快,使您不必担心数组中对象的当前和future struct .

如果您解构、重命名、重新构造,那么只要某个元素缺少或重命名了键,或者其中包含一些额外的数据,您就会丢失 struct 中没有显式寻址的所有元素的键和值.


另一种避免盲文本替换缺点的方法是使用jsonb operator-删除旧密钥,使用||重新添加新名称:

select id, json_agg(   e - 'serial_number'
                    || jsonb_build_object('serialNumber',e->'serial_number') )
from user_phones,jsonb_array_elements(phones::jsonb)_(e) 
group by 1;

这样,您实际上只重命名了每个对象中的键,而不需要对其周围的 struct 进行任何假设.请注意,从json to jsonb开始切换将压缩无关紧要的空格,以及对密钥进行排序和重复数据删除.

Json相关问答推荐

如何获取brew list作为JSON输出

如何在Haskell中解析JSON,其中字段的名称可以是多个值之一,但应该转换为单个Haskell类型?

NiFi QueryRecord处理器- Select 可选的JSON属性

将PostgreSQL转换为JSON对象

使用快速json库编写json可以消除所有缩进

使用jq过滤复杂json对象中的数据

在 PostgreSQL 中 Select 分层 JSON 作为表

无法在 json --data 中使用变量

使用 SwiftUI 在 API 调用中解码嵌套 JSON 响应时遇到问题

如何在生产环境中更改 Flutter 应用程序中的数据模型?

为什么我不能在 C# 中引用 System.Runtime.Serialization.Json

按 JSON 数据类型 postgres 排序

规范化 JSON 文件

在 Django 1.9 中,使用 JSONField(本机 postgres jsonb)的约定是什么?

如何使用 Newtonsoft.Json 包在 C#(4.0) 中解析我的 json 字符串?

区分字符串和列表的 Pythonic 方式是什么?

如何在 Django JSONField 数据上聚合(最小/最大等)?

如何将 MongoDB 查询转换为 JSON?

字符串格式 JSON 字符串给出 KeyError

Volley JsonObjectRequest Post 参数不再起作用