如何解决从Java中的Json字符串生成聚合的Json数据
我已经从db2中获取了JSON字符串,需要对数据进行分组。
SELECT JSON_ARRAY(JSON_OBJECT('id' VALUE id,'items' VALUE JSON_OBJECT('item' value item,'itemScore' value itemScore,'stage' value stage,'reco' VALUE JSON_OBJECT('product' value product,'url' value url,'score' value score
format json)format json absent on null)
format json absent on null)format json absent on null)
FROM Product
GROUP BY id,item,itemScore,stage,url,product,score
如果Java或DB2查询中有解决方案,这将有所帮助。
需要使用id对JSON字符串执行分组。
JSON字符串:
[{
"id": 2078012,"items": {
"item": "cos","itemScore": -0.1334,"stage": 0.5,"reco": {
"product": "Language","url": "https://","score": 0.019
}
}
},{
"id": 2078012,"items": {
"item": "build","itemScore": -0.2858,"reco": {
"product": "Notifications","score": 0.0169
}
}
}]
预期输出: 需要使用ID对项目进行分组
我已经修改了预期的JSON,请帮助我创建更新的JSON。
[{
"id": 2078012,"reco": [{
"product": "Language","score": 0.019
},{
"product": "Notifications","score": 0.0169
}]
},"score": 0.0169
}]
}
}]
解决方法
您可能需要将其分解成几个步骤。
首先,一个与您的基表相似的基表。
db2 => SELECT * FROM PROD_T
ID ITEM ITEMSCORE STAGE PRODUCT URL SCORE
----------- -------------------- --------- ----- -------------------- -------------------- -------
2078012 cos -0,1334 0,5 Language https:// 0,0190
2078012 build -0,2585 0,5 Notification https:// 0,1690
2100000 alpha -0,5 Letter https:// 0,0190
2100000 beta -0,5 anouncement https:// 0,1690
步骤1:创建基本级别的json对象
select id,item,JSON_OBJECT('item' value item,'itemScore' value itemScore,'stage' value stage,'reco' VALUE JSON_OBJECT('product' value product,'url' value url,'score' value score
FORMAT JSON )
FORMAT JSON ABSENT ON NULL
RETURNING VARCHAR(200) FORMAT JSON) ITEM_JSON
FROM PROD_T
ID ITEM ITEM_JSON
----------- -------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2078012 cos {"item":"cos","itemScore":-0.1334,"stage":0.5,"reco":{"product":"Language","url":"https:\/\/","score":0.0190}}
2078012 build {"item":"build","itemScore":-0.2585,"reco":{"product":"Notification","score":0.1690}}
2100000 alpha {"item":"alpha","reco":{"product":"Letter","score":0.0190}}
2100000 beta {"item":"beta","reco":{"product":"anouncement","score":0.1690}}
步骤2:按ID分组,然后将对象汇总到一个数组中。
WITH BASE AS (
select id,'score' value score
FORMAT JSON )
FORMAT JSON ABSENT ON NULL
RETURNING VARCHAR(200) FORMAT JSON) ITEM_JSON
FROM PROD_T )
SELECT ID,JSON_ARRAY ( LISTAGG( ITEM_JSON,',') WITHIN GROUP (ORDER BY ITEM) FORMAT JSON ) ITEMS_ARRAY
FROM BASE GROUP BY ID
ID ITEMS_ARRAY
----------- --------------------------------------------------
2078012 [{"item":"build","score":0.1690}},{"item":"cos","score":0.0190}}]
2100000 [{"item":"alpha","score":0.0190}},{"item":"beta","score":0.1690}}]
第3步:为每个id行创建整个json_object
WITH BASE AS (
select id,'score' value score
FORMAT JSON )
FORMAT JSON ABSENT ON NULL
RETURNING VARCHAR(200) FORMAT JSON) ITEM_JSON
FROM PROD_T )
SELECT JSON_OBJECT ( KEY 'id' VALUE ID,KEY 'itens' VALUE
JSON_ARRAY ( LISTAGG( ITEM_JSON,') WITHIN GROUP (ORDER BY ITEM) FORMAT JSON )
FORMAT JSON ) json_objects
FROM BASE GROUP BY ID
json_objects
-----------------------------------------------------------------------------------------------------------------------------------
{"id":2078012,"itens":[{"item":"build","score":0.0190}}]}
{"id":2100000,"itens":[{"item":"alpha","score":0.1690}}]}
第4步:完整的ID的json文档数组
下面的查询应该可以工作
WITH BASE AS (
select id,'score' value score
FORMAT JSON )
FORMAT JSON ABSENT ON NULL
RETURNING VARCHAR(200) FORMAT JSON) ITEM_JSON
FROM PROD_T ),PROD_OBJS AS (
SELECT JSON_OBJECT ( KEY 'id' VALUE ID,') WITHIN GROUP (ORDER BY ITEM) FORMAT JSON )
FORMAT JSON ) json_objects
FROM BASE GROUP BY ID )
SELECT JSON_ARRAY (select json_objects FROM PROD_OBJS format json) FROM SYSIBM.SYSDUMMY1
但是,在我的系统(DB2 v11.5.0.1077)中,它由于内部编译错误而失败:
SQL0901N由于数据库,SQL语句或命令失败 系统错误。 (原因为“意外的agg opparm”。)SQLSTATE = 58004
但是,如果您遇到相同的情况,则可以在临时表中实现来自step3的输出,并从中执行最终数组。
DECLARE GLOBAL TEMPORARY TABLE prod_json_objcts AS (
WITH BASE AS (
select id,') WITHIN GROUP (ORDER BY ITEM) FORMAT JSON )
FORMAT JSON ) json_objects
FROM BASE GROUP BY ID
) WITH DATA
SELECT JSON_ARRAY (select json_objects FROM session.prod_json_objcts format json) FROM SYSIBM.SYSDUMMY1
产生最终的json数组:
[{"id":2078012,"itens":[
{"item":"build","score":0.0190}}
]
},{"id":2100000,"itens":[
{"item":"alpha","score":0.1690}}
]
}
]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。