问题描述
嗨,
我们的JSON对象作为BLOB类型存储在表中。JSON具有嵌套数组。是否有可能我可以获得嵌套数组d的最后一项?有没有一种方法,我也可以得到数组d的大小?
当前输出:
100 200是
100 200否
100 200是
预期产出:
100 200是
100 200是
谢谢你的帮助!
夏天
我们的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))
-返回位置 = 大小/最大值的行:
同时,您可以在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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




