JSON数据到数据库,将Json与字段包含数组[string]映射,转换为字符串

问题描述 投票:0回答:2

我使用此代码将 JSON 数据记录到 Oracle 数据库。

SELECT NOM, PRENOMS, DATE_NAISS
    FROM JSON_TABLE('[
        {
            "Id": 123,
            "Nom": "Toto",
            "Prenoms": [
                "Pascal",
                "Vincent"
            ],
            "DateNaissance": "1983-01-01T00:00:00"
        }]', '$[*]' COLUMNS 
             (
               "NOM"        PATH '$.Nom',
               "PRENOMS"    PATH '$.Prenoms',
               "DATE_NAISS" DATE PATH  '$.DateNaissance'
             ) ) T_JSON;

我想像这样连接字段“Prenoms”的元素

[ {
    "Id": 123,
    "Nom": "Toto",
    "Prenoms": "Pascal, Vincent",
    "DateNaissance": "1983-01-01T00:00:00",
} ]

你能帮我一下吗?

谢谢

这是我尝试过的代码,但不行,它返回一个空字符串:

"PRENOMS" varchar2(100) FORMAT JSON PATH '$."Prenoms"[*]'
arrays json string oracle
2个回答
0
投票

prenoms
数组提取为数组,然后将其单独拆分,然后聚合成您想要的格式:

SELECT NOM,
       ( SELECT LISTAGG(prenom, ', ')
         FROM   JSON_TABLE(
                  PRENOMS,
                  '$[*]'
                  COLUMNS (prenom VARCHAR2(200) PATH '$')
                )
       ) AS prenoms,
       DATE_NAISS
FROM   JSON_TABLE('[
  {
    "Id": 123,
    "Nom": "Toto",
    "Prenoms": [ "Pascal", "Vincent" ],
    "DateNaissance": "1983-01-01T00:00:00"
  }
]',
        '$[*]'
        COLUMNS (
          "NOM"        VARCHAR2(200)    PATH '$.Nom',
          "PRENOMS"    CLOB FORMAT JSON PATH '$.Prenoms',
          "DATE_NAISS" DATE             PATH  '$.DateNaissance'
        )
      );

哪个输出:

诺姆 预提名 日期_NAISS
托托 文森特·帕斯卡 1983-01-01 00:00:00

如果您希望以 JSON 格式返回:

SELECT JSON_ARRAYAGG(
         JSON_OBJECT(
           KEY 'Id' VALUE ID,
           KEY 'Nom' VALUE NOM,
           KEY 'Prenoms' VALUE (
             SELECT LISTAGG(prenom, ', ')
             FROM   JSON_TABLE(
                      PRENOMS,
                      '$[*]'
                      COLUMNS (prenom VARCHAR2(200) PATH '$')
                    )
           ),
           KEY 'DateNaissance' VALUE DATE_NAISS
         )
       ) AS json
FROM   JSON_TABLE('[
  {
    "Id": 123,
    "Nom": "Toto",
    "Prenoms": [ "Pascal", "Vincent" ],
    "DateNaissance": "1983-01-01T00:00:00"
  }
]',
        '$[*]'
        COLUMNS (
          ID         NUMBER           PATH '$.Id',
          NOM        VARCHAR2(200)    PATH '$.Nom',
          PRENOMS    CLOB FORMAT JSON PATH '$.Prenoms',
          DATE_NAISS DATE             PATH '$.DateNaissance'
        )
      );

哪个输出:

JSON
[{"Id":123,"Nom":"托托","Prenoms":"帕斯卡,文森特","DateNaissance":"1983-01-01T00:00:00"}]

小提琴


0
投票

您也可以使用嵌套路径来完成:

        '$[*]' COLUMNS 
         (
            id  PATH '$.Id',
           NOM        PATH '$.Nom',
           DATE_NAISS DATE PATH  '$.DateNaissance',
           nested path '$.Prenoms[*]'
           columns (
            ord for ordinality,
            PRENOM    PATH '$'
           )
         ) 

然后

listagg(PRENOM, ', ') within group(order by ord) as prenoms
© www.soinside.com 2019 - 2024. All rights reserved.