You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle数据库中JSON数组字段转拼接字符串的实现求助

解决Oracle JSON数组拼接为字符串的问题

你之前的写法无法得到预期结果,原因是$.Prenoms[*]返回的是数组元素的集合,直接用FORMAT JSON结合VARCHAR2类型无法将这些元素自动拼接为逗号分隔的字符串,因此返回空值。

以下是两种可行的解决方案:

方案一:嵌套JSON_TABLE + LISTAGG聚合

通过嵌套的JSON_TABLE拆分Prenoms数组,再用LISTAGG函数将元素拼接为逗号分隔的字符串:

SELECT 
  t.NOM,
  LISTAGG(p.prenom, ', ') WITHIN GROUP (ORDER BY p.rn) AS PRENOMS,
  t.DATE_NAISS
FROM JSON_TABLE(
  '[
    {
        "Id": 123,
        "Nom": "Toto",
        "Prenoms": [
            "Pascal",
            "Vincent"
        ],
        "DateNaissance": "1983-01-01T00:00:00"
    }]', 
  '$[*]' COLUMNS (
    "NOM"        PATH '$.Nom',
    "DATE_NAISS" DATE PATH '$.DateNaissance',
    "PRENOMS_ARR" JSON PATH '$.Prenoms'
  )
) t,
JSON_TABLE(
  t.PRENOMS_ARR,
  '$[*]' COLUMNS (
    prenom VARCHAR2(50) PATH '$',
    rn FOR ORDINALITY -- 保留数组元素的原始顺序
  )
) p
GROUP BY t.NOM, t.DATE_NAISS;

方案二:子查询聚合

在主查询中通过子查询完成数组元素的拆分与聚合,写法更紧凑:

SELECT 
  NOM,
  (SELECT LISTAGG(prenom, ', ') WITHIN GROUP (ORDER BY rn)
   FROM JSON_TABLE(PRENOMS_ARR, '$[*]' COLUMNS (
     prenom VARCHAR2(50) PATH '$',
     rn FOR ORDINALITY
   ))) AS PRENOMS,
  DATE_NAISS
FROM JSON_TABLE(
  '[
    {
        "Id": 123,
        "Nom": "Toto",
        "Prenoms": [
            "Pascal",
            "Vincent"
        ],
        "DateNaissance": "1983-01-01T00:00:00"
    }]', 
  '$[*]' COLUMNS (
    "NOM"        PATH '$.Nom',
    "DATE_NAISS" DATE PATH '$.DateNaissance',
    "PRENOMS_ARR" JSON PATH '$.Prenoms'
  )
) t;

执行以上任意一种SQL,都会得到你需要的结果:PRENOMS字段的值为Pascal, Vincent。

内容的提问来源于stack exchange,提问作者Demago

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:33:27