sql - 使用 oracle sqlplus 将两个 json 对象合二为一
问题描述
我有以下查询:
SELECT json_object('time' VALUE localtimestamp) || ' '||
json_object('db_schema' VALUE 'USER1') || ' '||
json_objectagg(JOB_STAT value count(ID) returning varchar2(32000))
FROM <TABLE> GROUP BY job_stat;
输出如下:
{"time":"2020-10-20T16:47:39.117075"} {"db_schema":"USER1"} {"SUBMIT":123,"RUN":456}
我实际上想要这样:
{"time":"2020-10-20T16:47:39.117075","db_schema":"USER1", ["SUBMIT":123, "RUN":456]}
因此,这一切都在一个对象中。您可以帮助更改查询以实现此目的吗?
解决方案
如果您的 Oracle 版本支持它,您可以使用JSON_MERGEPATCH
:
SELECT JSON_MERGEPATCH(
json_object(
'time' VALUE localtimestamp,
'db_schema' VALUE 'USER1'
),
json_objectagg(
JOB_STAT VALUE COUNT(id)
)
RETURNING CLOB
) AS json
FROM table_name
GROUP BY job_stat;
其中,对于样本数据:
CREATE TABLE table_name ( id, job_stat ) AS
SELECT LEVEL, 'SUBMIT' FROM DUAL CONNECT BY LEVEL <= 456
UNION ALL
SELECT LEVEL, 'RUN' FROM DUAL CONNECT BY LEVEL <= 123;
输出:
| JSON | | :------------------------------------------------ ------------------------------ | | {"time":"2020-10-20T13:15:27.947079","db_schema":"USER1","SUBMIT":456,"RUN":123} |
或者,如果你想要一个数组,你可以聚合两次:
SELECT json_object(
'time' VALUE localtimestamp,
'db_schema' VALUE 'USER1',
'job_stats' VALUE JSON_ARRAYAGG( json_job_stat )
) AS json
FROM (
SELECT JSON_OBJECT( JOB_STAT VALUE COUNT(id) ) AS json_job_stat
FROM table_name
GROUP BY job_stat
)
哪个输出:
| JSON | | :------------------------------------------------ ------------------------------------------------ | | {"time":"2020-10-20T13:25:37.406742","db_schema":"USER1","job_stats":[{"SUBMIT":456},{"RUN":123}]} |
db<>在这里摆弄
推荐阅读
- pandas - 绘制图表时没有发现带有标签的句柄会出现图例错误
- ffmpeg - 如何使用 ffmpeg 将一组 PPM 文件转换为单个 .mp4 视频
- html - Outlook 电子邮件模板填充/边距减去不起作用
- go - 如何在 go echo 中传递中间件和处理程序周围的对象?
- visual-studio-code - gulp 任务 - 如何在 launch.json 中创建“config”对象
- firebase - Flutter Firebase:我应该使用服务器向我的用户发送通知吗?
- c# - 在具有种子实体的表中添加数据后出现重复键错误
- ios - 如何在两个 UICollectionViewCells 之间添加一个视图?
- javascript - 如何使用 API 调整制表器中的动态列和数据
- angular - 如何分析 source-map-explorer 生成的源地图的 [no source] 块?