在执行SELECT
查询时,我需要重新Mappostgres
中数组对象的属性名称。
表user_phones
具有列id
和phones
。假设phones
列类型为json
,数组具有以下结构:
[
{
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
有没有一个简单的方法在postgres中执行此操作?
2条答案
按热度按时间rjzwgtxy1#
转换为
text
,replace()
,转换回json
:Demo at db<>fiddle字符串
| ID| jsonb_漂亮|
| --|--|
| 1 |的 { “model”:“samsung s23 utra”, “serialNumber”:“12345” }, { “model”:“iphone15”, “serialNumber”:“12333” }]的一种|
它将针对任何匹配模式的对象,不管它实际上是键还是值,或者两者的一部分。从好的方面来说,它更简单,更快,并且让你不必担心数组中对象的当前和未来结构。
如果你解构,重命名,重构,你会失去你没有显式寻址的结构的所有元素的键和值,每当一个元素有一个丢失或重命名的键,或者有一些额外的数据。
另一种摆脱盲文本替换缺点的方法是使用
jsonb
操作符-
删除旧键,并使用||
重新添加新名称:型
这样,你就可以在每个对象中只重命名键,而不需要对它周围的结构做任何假设。注意,从
json
tojsonb
切换将压缩无关紧要的空白,以及对键进行排序和重复数据删除。xuo3flqw2#
使用
json_array_elements()
函数将JSON数组扩展为多行,然后应用json_build_object
重构JSON元素,最后使用json_agg()
将这些元素合并回JSON数组。字符串
结果如下:
型
Demo here的