如何使用JSON_TABLE从Oracle JSON列获取键值作为结果集

mar*_*nia 5 oracle json

我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中的类似方法.

Luk*_*der 3

这是我在 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)