[英]Is there a way to use a JSON array for multi-row data in Oracle SQL?
編輯:@mathguy 已經正確指出我需要使用 JSON_ARRAYAGG 來正確處理多行數據。 但是,我仍然有一個未解決的問題,即 lastName object 沒有返回語音標記。 任何人都可以從下面的 SQL 中建議為什么會這樣嗎? 非常感謝。
我需要生成 JSON 以通過 API 為大量客戶插入數據。這包含 JSON arrays(一個用於所有客戶的總體數組和一個用於潛在多個地址的數組)和對象。 我目前使用的代碼產生了這個:
[
{
"address": [
{
"addressLine1": "ALLIANCE & LEICESTER PLC",
"addressLine2": "CUSTOMER SERVICES",
"addressLine3": "CARLTON PARK",
"region": "LEICESTERSHIRE",
"city": "LEICESTER",
"zip": "LE190AL",
"type": "residential"
},
{
"addressLine1": null,
"addressLine2": null,
"addressLine3": null,
"region": null,
"city": null,
"zip": null,
"type": null
}
],
"firstName": "SIOBHAN",
"lastName":TOWNSEND
}
]
[
{
"address": [
{
"addressLine1": "VIA DE LOS POBLADOS 2",
"addressLine2": null,
"addressLine3": null,
"region": null,
"city": "MADRID",
"zip": "28033",
"type": "residential"
},
{
"addressLine1": null,
"addressLine2": null,
"addressLine3": null,
"region": null,
"city": null,
"zip": null,
"type": null
}
],
"firstName": "HAYDEN",
"lastName":THOMSON
}
]
[
{
"address": [
{
"addressLine1": "VIA DE LOS POBLADOS 1",
"addressLine2": null,
"addressLine3": null,
"region": null,
"city": "MADRID",
"zip": "28034",
"type": "residential"
},
{
"addressLine1": null,
"addressLine2": null,
"addressLine3": null,
"region": null,
"city": null,
"zip": null,
"type": null
}
],
"firstName": "MADISON",
"lastName":FROST
}
]
...但是我需要它看起來像這樣:
[
{
"address": [
{
"addressLine1": "ALLIANCE & LEICESTER PLC",
"addressLine2": "CUSTOMER SERVICES",
"addressLine3": "CARLTON PARK",
"region": "LEICESTERSHIRE",
"city": "LEICESTER",
"zip": "LE190AL",
"type": "residential"
},
{
"addressLine1": null,
"addressLine2": null,
"addressLine3": null,
"region": null,
"city": null,
"zip": null,
"type": null
}
],
"firstName": "SIOBHAN",
"lastName": "TOWNSEND"
},
{
"address": [
{
"addressLine1": "VIA DE LOS POBLADOS 2",
"addressLine2": null,
"addressLine3": null,
"region": null,
"city": "MADRID",
"zip": "28033",
"type": "residential"
},
{
"addressLine1": null,
"addressLine2": null,
"addressLine3": null,
"region": null,
"city": null,
"zip": null,
"type": null
}
],
"firstName": "HAYDEN",
"lastName": "THOMSON"
},
{
"address": [
{
"addressLine1": "VIA DE LOS POBLADOS 1",
"addressLine2": null,
"addressLine3": null,
"region": null,
"city": "MADRID",
"zip": "28034",
"type": "residential"
},
{
"addressLine1": null,
"addressLine2": null,
"addressLine3": null,
"region": null,
"city": null,
"zip": null,
"type": null
}
],
"firstName": "MADISON",
"lastName": "FROST"
}
]
這里的主要區別是:
這是我一直在運行的 SQL:
SELECT
json_array(
json_object('address' VALUE
json_array(json_object('addressLine1' VALUE address.line_1,
'addressLine2' VALUE address.line_2,
'addressLine3' VALUE address.line_3,
'region' VALUE address.county,
'city' VALUE address.town,
'zip' VALUE address.postcode,
'type' VALUE 'residential'),
json_object('addressLine1' VALUE correspondence_address.line_1,
'addressLine2' VALUE correspondence_address.line_2,
'addressLine3' VALUE correspondence_address.line_3,
'region' VALUE correspondence_address.county,
'city' VALUE correspondence_address.town,
'zip' VALUE correspondence_address.postcode,
'type' VALUE case when person.correspondence_address_id is null then null else 'correspondence' end)
),
'firstName' VALUE person.first_name,
'lastName' VALUE person.surname
FORMAT JSON)
)as customer_json
FROM
person,
address,
address correspondence_address
WHERE
person.address_id=address.id
and person.correspondence_address_id=correspondence_address.id(+)
這是針對 Oracle 19c 數據庫運行的。 如果可以設置一個 JSON_ARRAY 來環繞整個數據集,而不是在每個客戶記錄后結束並重新啟動,誰能幫我解決問題?
感謝@mathguy 正確指出我需要使用 JSON_ARRAYAGG 才能使 SQL 正確處理多行。
我意識到我需要從末尾刪除“FORMAT JSON”,因為它尾隨 lastName 變量並影響它的返回方式。 刪除它解決了我的問題。 這是工作代碼:
SELECT
json_arrayagg(json_object('address' VALUE
json_array(json_object('addressLine1' VALUE address.line_1,
'addressLine2' VALUE address.line_2,
'addressLine3' VALUE address.line_3,
'region' VALUE address.county,
'city' VALUE address.town,
'zip' VALUE address.postcode,
'type' VALUE 'residential'),
json_object('addressLine1' VALUE correspondence_address.line_1,
'addressLine2' VALUE correspondence_address.line_2,
'addressLine3' VALUE correspondence_address.line_3,
'region' VALUE correspondence_address.county,
'city' VALUE correspondence_address.town,
'zip' VALUE correspondence_address.postcode,
'type' VALUE case when person.correspondence_address_id is null then null else 'correspondence' end)
),
'firstName' VALUE person.first_name,
'lastName' VALUE person.surname
))as customer_json
FROM 人,地址,地址 correspondence_address WHERE person.address_id=address.id and person.correspondence_address_id=correspondence_address.id(+)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.