重复 JSON 具有行限制的聚合数组
Repeating JSON Aggregated Array with Row Limits
我有一个带有 JSON 聚合数组的 Oracle 19 数据库,我需要将其切断并在设定的行数后重复,例如:
[{"personId": "13274614","surname": "SMITH"},{"personId": "13275037","surname": "JONES"}]
[{"personId": "13275038","surname": "THOMAS"},{"personId": "13275039","surname": "BAKER"}]
...等这里有一些基本的 SQL 来说明我当前的数据集是如何组合在一起的:
SELECT
json_arrayagg(json_object('personId' VALUE person.id,
'surname' VALUE person.surname
)
RETURNING CLOB) as customer_json
FROM
person
我需要将客户数据推送到 API 端点。一次推送 1 条客户记录的性能不佳,但整个数据集数以百万计,因此无法放入单个数组中,因此,如果可能的话,我需要实现两全其美——一个数组中有 200 条客户记录,这然后结束,下一行开始包含接下来的 200 个客户的新数组。
我搜索并发现了一些关于 LIMIT 函数的提及,但未能成功应用它。
有人知道我该如何实现吗?
从 Oracle 12 开始,您可以使用 ORDER BY ... OFFSET ... FETCH NEXT ...
来限制 sub-query:
中的行数
SELECT json_arrayagg(
json_object(
'personId' VALUE id,
'surname' VALUE surname
)
RETURNING CLOB
) as customer_json
FROM (
SELECT id, surname
FROM person
ORDER BY id
OFFSET 0 ROWS
FETCH NEXT 200 ROWS ONLY
)
Oracle 12之前,可以使用ROW_NUMBER
解析函数:
SELECT json_arrayagg(
json_object(
'personId' VALUE id,
'surname' VALUE surname
)
RETURNING CLOB
) as customer_json
FROM (
SELECT id,
surname,
ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM person
)
WHERE rn BETWEEN 1 AND 200;
如果您想要 200 个行组中的所有行,则:
SELECT json_arrayagg(
json_object(
'personId' VALUE id,
'surname' VALUE surname
)
RETURNING CLOB
) as customer_json
FROM (
SELECT id,
surname,
CEIL(ROW_NUMBER() OVER (ORDER BY id)/200) AS grp
FROM person
)
GROUP BY grp;
我有一个带有 JSON 聚合数组的 Oracle 19 数据库,我需要将其切断并在设定的行数后重复,例如:
[{"personId": "13274614","surname": "SMITH"},{"personId": "13275037","surname": "JONES"}]
[{"personId": "13275038","surname": "THOMAS"},{"personId": "13275039","surname": "BAKER"}]
...等这里有一些基本的 SQL 来说明我当前的数据集是如何组合在一起的:
SELECT
json_arrayagg(json_object('personId' VALUE person.id,
'surname' VALUE person.surname
)
RETURNING CLOB) as customer_json
FROM
person
我需要将客户数据推送到 API 端点。一次推送 1 条客户记录的性能不佳,但整个数据集数以百万计,因此无法放入单个数组中,因此,如果可能的话,我需要实现两全其美——一个数组中有 200 条客户记录,这然后结束,下一行开始包含接下来的 200 个客户的新数组。
我搜索并发现了一些关于 LIMIT 函数的提及,但未能成功应用它。
有人知道我该如何实现吗?
从 Oracle 12 开始,您可以使用 ORDER BY ... OFFSET ... FETCH NEXT ...
来限制 sub-query:
SELECT json_arrayagg(
json_object(
'personId' VALUE id,
'surname' VALUE surname
)
RETURNING CLOB
) as customer_json
FROM (
SELECT id, surname
FROM person
ORDER BY id
OFFSET 0 ROWS
FETCH NEXT 200 ROWS ONLY
)
Oracle 12之前,可以使用ROW_NUMBER
解析函数:
SELECT json_arrayagg(
json_object(
'personId' VALUE id,
'surname' VALUE surname
)
RETURNING CLOB
) as customer_json
FROM (
SELECT id,
surname,
ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM person
)
WHERE rn BETWEEN 1 AND 200;
如果您想要 200 个行组中的所有行,则:
SELECT json_arrayagg(
json_object(
'personId' VALUE id,
'surname' VALUE surname
)
RETURNING CLOB
) as customer_json
FROM (
SELECT id,
surname,
CEIL(ROW_NUMBER() OVER (ORDER BY id)/200) AS grp
FROM person
)
GROUP BY grp;