我google了很多,似乎无法找到一个简单的解决方案来解决我的简单用例.我在Oracle 12C数据库中有一个json列(当然是一个带有json约束的varchar),在该列中我存储了一个这样的Map表示
{
"a":9.0847,
"b":859.947
}
Run Code Online (Sandbox Code Playgroud)
在plsql中,我想返回一个看起来像这样的结果集
key val
a 9.0847
b 859.947
Run Code Online (Sandbox Code Playgroud)
我已经修改了下面看似无限的变化,并且所有的例子对于我的用例来说都太刻薄了.
select b.* from mytable a,json_table(myJsonCol,'$'
columns ( value varchar2(500) path '$.myjsonkey')) b
Run Code Online (Sandbox Code Playgroud)
但这只返回一个值列表,没有相应的键.json数据总是字符串双键值.
谢谢
编辑为了添加更多的上下文,我在postgres中使用json_each来实现这一点,我正在寻找Oracle中的类似方法.
这是我在 18c 和 21c 上尝试过的通用解决方案,它使用 SQLWITH函数中的 PL/SQL API 来生成所需的输出(当然,您也可以存储该函数):
with
function json_keys(j varchar2) return clob as
jo json_object_t;
k json_key_list;
r clob;
begin
jo := json_object_t(j);
k := jo.get_keys();
select coalesce(
json_arrayagg(column_value returning clob),
json_array(returning clob)
)
into r
from table (k);
return r;
end;
select o, json_keys(o)
from (
select '{}' as o from dual union all
select '{"a":1}' from dual union all
select '{"a":1,"b":2}' from dual
) t;
Run Code Online (Sandbox Code Playgroud)
导致:
|O |JSON_KEYS(O)|
|-------------|------------|
|{} |[] |
|{"a":1} |["a"] |
|{"a":1,"b":2}|["a","b"] |
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1501 次 |
| 最近记录: |