簡體   English   中英

Oracle SQL中的多行數據有沒有辦法使用JSON數組?

[英]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"
    }
]

這里的主要區別是:

  • 總體數組應從第一條記錄的開頭開始,到最后一條記錄的末尾結束,而不是在每個“行”之后結束
  • 出於某種原因,列表中的最后一個 object (lastName) 沒有在 speechmarks 中正確列出其值
  • 每個客戶/行之間應出現逗號分隔符

這是我一直在運行的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM