暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 如何获取JSON数组中的最后一项

ASKTOM 2020-03-18
480

问题描述

嗨,

我们的JSON对象作为BLOB类型存储在表中。JSON具有嵌套数组。是否有可能我可以获得嵌套数组d的最后一项?有没有一种方法,我也可以得到数组d的大小?

select jt.*
from json_table ('{
  "a": 100,
  "b": 200,
  "c": [
    {
      "d": [
        {
          "x": "yes"
        }
      ]
    },
    {
      "d": [
        {
          "x": "no"
        },
        {
          "x": "yes"
        }
      ]
    }
  ]
}', '$' 
 columns (
   a number path '$.a',
   b number path '$.b',
   nested path '$.c.d[*]' columns (
     x varchar(16) path '$.x'
   )
 )) jt; 



当前输出:
100 200是
100 200否
100 200是

预期产出:
100 200是
100 200是

谢谢你的帮助!
夏天

专家解答

Oracle数据库18c添加了size() JSON项-方法它返回数组中元素的数量。或者一个用于标量和物体。

同时,您可以在JSON_table中添加 “for ordinality” 列。这将返回元素在数组中的位置。虽然这是一个索引,而不是像JSON数组那样的零索引。

所以:

-添加位置
-在 (...) 上查找数组中的元素数 (size() 或max(pos))
-返回位置 = 大小/最大值的行:

with jdata as (
  select '{
  "a": 100,
  "b": 200,
  "c": [
    {
      "d": [
        {
          "x": "yes"
        }
      ]
    },
    {
      "d": [
        {
          "x": "no"
        },
        {
          "x": "yes"
        }
      ]
    }
  ]
}' j from dual
), rws as (
  select jt.*, 
         max ( posd ) over (
           partition by posc
         ) d_mx_sz
  from   jdata j, json_table ( j, '$' 
   columns (
     a number path '$.a',
     b number path '$.b',
     csize number path '$.c.size()',
     nested path '$.c[*]' columns (
       dsize int path '$.d.size()',
       darr  format json path '$.d',
       posc for ordinality,
       nested path '$.d[*]' columns (
         posd for ordinality,
         x varchar2(10) path '$.x'
       ) 
     )
   )
  ) jt
)
  select * from rws
  where  posd = d_mx_sz; 
  
A      B      CSIZE    DSIZE    DARR                        POSC    POSD    X      D_MX_SZ   
   100    200        2        1 [{"x":"yes"}]                     1       1 yes             1 
   100    200        2        2 [{"x":"no"},{"x":"yes"}]          2       2 yes             2

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论