将列转换为 json 数组的最佳方法 (Oracle)
best way to convert column to json array (Oracle)
将列的数据联合到 json 数组的最佳方法是什么?
我有 table
Foreign_ID | Primary_ID | Position | Name
143 2344 Postman Ann
143 2345 Postman Tim
144 2346 Postman Bob
144 2347 Postman Dan
143 2348 Student Jim
143 2349 Student Corey
146 2350 Student Justin
146 2351 Student Keith
而且我需要将名称列中的数据联合到每个外国 ID 的 json 数组,其中行在位置列中具有相同的数据。然后,应将此 json 数组插入值合并的行之一的名称列中。结果 table 应如下所示:
Foreign_ID | Primary_ID | Position | Name
143 2344 Postman ["Ann","Tim"]
144 2346 Postman ["Bob","Dan"]
143 2348 Student ["Jim","Corey"]
146 2350 Student ["Justin","Keith"]
谢谢。
看来我找到了解决方案,查询是
MERGE INTO TESTSCHEDULER TS
USING (SELECT Foreign_ID,
Position,
MIN(Primary_ID) AS MINID,
COUNT(*),
JSON_ARRAYAGG(Name) AS JSONNAME
FROM TESTSCHEDULER
GROUP BY Position,
Foreign_ID
HAVING COUNT(*) > 1
) JSONTABLE ON (TS.Position = JSONTABLE.Position AND TS.Foreign_ID = JSONTABLE.Foreign_ID)
WHEN MATCHED THEN
UPDATE SET TS.NAME = JSONTABLE.JSONNAME WHERE TS.Primary_ID = JSONTABLE.MINID;
DELETE FROM TESTSCHEDULER WHERE Primary_ID IN (
SELECT Primary_ID FROM TESTSCHEDULER
INNER JOIN (SELECT Foreign_ID,
Position,
MIN(Primary_ID) AS MINID,
COUNT(*)
FROM TESTSCHEDULER
GROUP BY Position, Foreign_ID
HAVING COUNT(*) > 1) JSONTABLE
ON TESTSCHEDULER.FOREIGN_ID = JSONTABLE.Foreign_ID
AND TESTSCHEDULER.Position = JSONTABLE.Position
AND TESTSCHEDULER.PRIMARY_ID > JSONTABLE.MINID);
其中 JSON_ARRAYAGG(col)
函数适用于数据库版本 12+
...对于低于 12.2 的版本,替代 JSON_ARRAYAGG 是:
'[' || replace(rtrim (xmlagg (xmlelement (e, '"' || Name || '",')).extract ('//text()'), ','), '"','"') || ']' AS JSONNAME
这是用于 clob 列,对于 varchar 使用 LISTAGG
将列的数据联合到 json 数组的最佳方法是什么?
我有 table
Foreign_ID | Primary_ID | Position | Name
143 2344 Postman Ann
143 2345 Postman Tim
144 2346 Postman Bob
144 2347 Postman Dan
143 2348 Student Jim
143 2349 Student Corey
146 2350 Student Justin
146 2351 Student Keith
而且我需要将名称列中的数据联合到每个外国 ID 的 json 数组,其中行在位置列中具有相同的数据。然后,应将此 json 数组插入值合并的行之一的名称列中。结果 table 应如下所示:
Foreign_ID | Primary_ID | Position | Name
143 2344 Postman ["Ann","Tim"]
144 2346 Postman ["Bob","Dan"]
143 2348 Student ["Jim","Corey"]
146 2350 Student ["Justin","Keith"]
谢谢。
看来我找到了解决方案,查询是
MERGE INTO TESTSCHEDULER TS
USING (SELECT Foreign_ID,
Position,
MIN(Primary_ID) AS MINID,
COUNT(*),
JSON_ARRAYAGG(Name) AS JSONNAME
FROM TESTSCHEDULER
GROUP BY Position,
Foreign_ID
HAVING COUNT(*) > 1
) JSONTABLE ON (TS.Position = JSONTABLE.Position AND TS.Foreign_ID = JSONTABLE.Foreign_ID)
WHEN MATCHED THEN
UPDATE SET TS.NAME = JSONTABLE.JSONNAME WHERE TS.Primary_ID = JSONTABLE.MINID;
DELETE FROM TESTSCHEDULER WHERE Primary_ID IN (
SELECT Primary_ID FROM TESTSCHEDULER
INNER JOIN (SELECT Foreign_ID,
Position,
MIN(Primary_ID) AS MINID,
COUNT(*)
FROM TESTSCHEDULER
GROUP BY Position, Foreign_ID
HAVING COUNT(*) > 1) JSONTABLE
ON TESTSCHEDULER.FOREIGN_ID = JSONTABLE.Foreign_ID
AND TESTSCHEDULER.Position = JSONTABLE.Position
AND TESTSCHEDULER.PRIMARY_ID > JSONTABLE.MINID);
其中 JSON_ARRAYAGG(col)
函数适用于数据库版本 12+
...对于低于 12.2 的版本,替代 JSON_ARRAYAGG 是:
'[' || replace(rtrim (xmlagg (xmlelement (e, '"' || Name || '",')).extract ('//text()'), ','), '"','"') || ']' AS JSONNAME
这是用于 clob 列,对于 varchar 使用 LISTAGG