postgresql - 通过Postgresql查询在Object的嵌套数组中插入UUID类型的元素
问题描述
当前 JSON
{
"layout":"dynamicReport1",
"templateType":"DYNAMIC_REPORTS",
"containers":{
"fieldsContainer":[
{
"fieldName":"role_id",
"displayName":"Role",
"fieldType":"text",
"isHidden":true,
"index":0,
"queryForParam":"select name as \"role_id\" from um_role_master where id=#role_id#",
"queryIdForParam":476
},
{
"fieldName":"course_id",
"displayName":"Course",
"fieldType":"text",
"isHidden":true,
"index":1,
"queryForParam":"select course_name as course_id from tr_course_master where course_id=#course_id#",
"queryIdForParam":477
},
{
"fieldName":"location_id",
"displayName":"Location",
"fieldType":"text",
"isHidden":true,
"index":2,
"queryForParam":"select name as location_id from location_master where id = #location_id#",
"queryIdForParam":478
}
]
}
}
层次结构就像
containers -> fieldContainer -> object
以上是我的 json 配置,我想queryUUIDForParam: random UUID
通过查询添加到每个对象。
我怎样才能插入?
我试图通过此查询获取更新的配置,但它会引发错误:
select config::jsonb || ('{"queryUUIDForParam":' || cast(uuid as text) || '}')::jsonb
错误 :
SQL 错误 [22P02]:错误:json 类型的输入语法无效详细信息:令牌“5574ff23”无效。其中:JSON 数据,第 1 行:{"queryUUIDForParam":5574ff23...
我的预期输出是在 Object Like 中添加“queryUUIDForParam”元素。我想附加一个带有 UUID 值的元素。这个 UUId 值是使用随机函数生成的。
{
"layout":"dynamicReport1",
"templateType":"DYNAMIC_REPORTS",
"containers":{
"fieldsContainer":[
{
"fieldName":"role_id",
"displayName":"Role",
"fieldType":"text",
"isHidden":true,
"index":0,
"queryForParam":"select name as \"role_id\" from um_role_master where id=#role_id#",
"queryIdForParam":476,
"queryUUIDForParam":"1ea99f17-6965-4a0d-8d31-22b8777b9c62"
},
{
"fieldName":"course_id",
"displayName":"Course",
"fieldType":"text",
"isHidden":true,
"index":1,
"queryForParam":"select course_name as course_id from tr_course_master where course_id=#course_id#",
"queryIdForParam":477,
"queryUUIDForParam":"3ea99f17-6965-4a0d-8d31-22b8777b9c62"
},
{
"fieldName":"location_id",
"displayName":"Location",
"fieldType":"text",
"isHidden":true,
"index":2,
"queryForParam":"select name as location_id from location_master where id = #location_id#",
"queryIdForParam":478,
"queryUUIDForParam":"9ea99f17-6965-4a0d-8d31-22b8777b9c62"
}
]
}
}
提前致谢 :)
解决方案
试试这个:
with cte as (select jsonb_array_elements(jsonb_extract_path(config, 'containers','fieldsContainer')::jsonb) "objects" from example),
final_array as (
select jsonb_build_array(d) "array_data" from (select array_agg(objects::jsonb || jsonb_build_object('queryUUIDForParam',(select uuid_generate_v4()))) "fieldsContainer" from cte )d)
select jsonb_set(
config::jsonb,
'{containers,fieldsContainer}', (f.array_data),false)
from example, final_array f;
如果您想为每个对象使用不同的 uuid
with cte as (select uuid_generate_v4() "uuid_",jsonb_array_elements(jsonb_extract_path(config, 'containers','fieldsContainer')::jsonb) "objects" from example),
final_array as (
select jsonb_build_array(d) "array_data" from (select array_agg(objects::jsonb || jsonb_build_object('queryUUIDForParam',uuid_)) "fieldsContainer" from cte )d)
select jsonb_set(
config::jsonb,
'{containers,fieldsContainer}', (f.array_data),false)
from example, final_array f;
注意:我使用 Postgres 的内置函数来生成 UUID。请在使用前运行以下语句
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
DB-Fiddle上的演示
推荐阅读
- html - 如何使元素在悬停时可见?
- selenium - GOCD 管道,Selenium ChromeDriver 窗口大小未设置
- amazon-web-services - ECS 使用 ECR 自动部署
- php - 如何在 Apache2 中使用 php 执行 shell 脚本?
- intellij-idea - Intellij 插件 - 我可以访问打开的编辑器窗口的内容吗?
- javascript - 只允许一个动作并用 javascript 记录它
- c# - Telerik RadGrid 上的自定义聚合
- r - 绘制组条形图而不重塑数据
- php - PHP 5.3 FTP JSON 文件上传使用 ftp_put 不上传
- sql - 比较 teradata 表的连续两行