oracle sql中的json_表未捕获嵌套json数据

oracle sql中的json_表未捕获嵌套json数据,sql,json,oracle,oracle12c,Sql,Json,Oracle,Oracle12c,我使用Oracle12c(12.2)读取表中的json数据 SELECT jt.name, jt.employee_id, jt.company FROM JSON_TABLE ( BFILENAME ('DB_DIR', 'vv.json') 我在json输出中嵌套了数据。嵌套数据中的键:值以值开头 “过去的工作”:“不适用”,用于记录。 对于它下面的其他许多记录,有如下实际值 "past_work": [{ "company"

我使用Oracle12c(12.2)读取表中的json数据

SELECT        jt.name,
jt.employee_id, 
jt.company    
FROM JSON_TABLE ( BFILENAME ('DB_DIR', 'vv.json')
我在json输出中嵌套了数据。嵌套数据中的键:值以值开头
“过去的工作”:“不适用”
,用于记录。 对于它下面的其他许多记录,有如下实际值

"past_work": [{ "company": "XXXXX",   "title": "XXXX"}]
但由于第一个记录done具有值以及开始和结束括号[],oracle不会捕获下面记录的嵌套值。 知道如何捕捉下面的记录吗

示例:实际数据如下所示

  SELECT
      jt.company,
      jt.title
    FROM
      JSON_TABLE(
        '{
           "employee_data": [
             { "employee_id": "111",
               "past_work": "N/A"
             },
             { "employee_id": "222",
               "past_work": [
                 {"company": "XXXXX", "title": "XXXX"},
                 {"company": "YYYYY", "title": "YYYY"}
               ]
             },
             { "employee_id": "333",
               "past_work": [
                 {"company": "XXXXX", "title": "XXXX"},
                 {"company": "YYYYY", "title": "YYYY"}
                ]
             }
           ]
         }',
        '$.past_work[*]'
          COLUMNS (
            company VARCHAR2(100) PATH '$.company',
            title   VARCHAR2(100) PATH '$.title'
          )
      )
        AS jt
现在,当我执行上述语句时,Employee_id 333及以下的公司值将为null


谢谢

首先,json片段的格式不正确,它必须被
{}
包围,才能作为json对象进行分析

  • {“过去的工作”:[{“公司”:“XXXXX”,“职务”:“XXXX”}}
然后,您可以告诉json解析器您想要从
过去的工作
元素中提取行

  • JSON_表(,'$.pass_work[*])
[*]
告诉解析器
过去的工作
是一个数组,并将该数组处理成json对象的行,而不是将整个数组作为单个json对象返回

这就有点像

SELECT
  jt.company,
  jt.title
FROM
  JSON_TABLE(
    '{
        "past_work": [
            {"company": "XXXXX", "title": "XXXX"},
            {"company": "YYYYY", "title": "YYYY"}
        ]
     }',
    '$.past_work[*]'
      COLUMNS (
        company VARCHAR2(100) PATH '$.company',
        title   VARCHAR2(100) PATH '$.title'
      )
  )
    AS jt


有关更多详细信息,我建议阅读以下文档:


编辑:更新的示例,几乎是文档的复制和粘贴

  • 请阅读文档


如果
过去的工作
应该是过去的
(公司、头衔)
对的数组,那么编码“无历史记录”的正确方法不是使用字符串值,比如
“N/a”
,而是应该使用空数组,如我在下面的代码中所示。如果你按自己的方式做,你仍然可以提取数据,但它会异常混乱。如果您使用JSON,请正确使用它

另外,你说你想提取公司和头衔。就这些?这毫无意义。相反,您可能希望提取每个员工的员工id以及工作历史记录。在工作历史中,我添加了一个专栏“为普通性”(显示哪家公司是第一家,哪家公司是第二家,等等)如果你不需要它,就不需要了

要访问嵌套列,必须使用
规范中的
嵌套
子句

select employee_id, ord, company, title
from   json_table(
        '{
           "employee_data": [
             { "employee_id": "111",
               "past_work": [ ]
             },
             { "employee_id": "222",
               "past_work": [
                 {"company": "XXXXX", "title": "XXXX"},
                 {"company": "YYYYY", "title": "YYYY"}
               ]
             },
             { "employee_id": "333",
               "past_work": [
                 {"company": "XXXXX", "title": "XXXX"},
                 {"company": "YYYYY", "title": "YYYY"}
                ]
             }
           ]
         }',   '$.employee_data[*]'
               columns ( 
                         employee_id varchar2(10) path '$.employee_id',
                           nested path '$.past_work[*]'
                               columns (
                                         ord     for ordinality,
                                         company varchar2(10) path '$.company',
                                         title   varchar2(10) path '$.title'
                                       )
                       )
       ) jt
order by employee_id, ord;
输出:

EMPLOYEE_ID ORD COMPANY TITLE
----------- --- ------- -----
111                          
222           1 XXXXX   XXXX 
222           2 YYYYY   YYYY 
333           1 XXXXX   XXXX 
333           2 YYYYY   YYYY 

谢谢大家的评论。已要求产品团队以正确的格式提供数据。

感谢您的回复。我的实际数据如下所示,并以json格式正确地形成
{“XXX_data”:[{“employee_id:“XXX”,“full_name:“XXXX Admin”,“pass_work:[{”company:“XXXXX”,“title:“XXXX”}]}
我刚才给了你一个嵌套数据的例子。现在有很多记录,第一个记录有“pass_work:“N.A”没有值,没有[]但下面的记录有许多键:值。所以我如何获取这些值。所有行的值都为null。Thanks@NitinJoshi编辑您的问题,使其包含完整且有用的json字符串示例,以及您希望从该字符串中获得的结果。注释不是放置这些详细信息的好地方,问题应包括删除所需的所有详细信息描述你的需求。这里有一些有用的材料,可以帮助你提供一些有用的例子来描述你的需求:你想要什么结果?对于
过去的工作
N/A
,在
公司
标题
列中应该有什么?你的JSON路径指向
过去的工作
元素,即root元素,不适用于您的情况。要访问这些数组,您需要
$。员工数据[*]。过去的工作[*]
感谢大家的评论。我们已要求产品团队以正确的格式提供数据。
EMPLOYEE_ID ORD COMPANY TITLE
----------- --- ------- -----
111                          
222           1 XXXXX   XXXX 
222           2 YYYYY   YYYY 
333           1 XXXXX   XXXX 
333           2 YYYYY   YYYY