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

时间:2016-11-04 13:59:36

标签: json oracle

我已经google了很多,似乎无法找到一个简单的解决方案来解决我的简单用例。 我在Oracle 12C数据库中有一个json列(实际上是一个带有json约束的varchar),在该列中我存储了一个像这样的Map的表示

{
"a":9.0847,
"b":859.947
}

在plsql中,我想返回一个看起来像这样的结果集

key val
a   9.0847
b   859.947

我已经修改了下面看似无限的变化,并且所有的例子对我的用例来说都太做作了。

select b.* from mytable a,json_table(myJsonCol,'$'
columns ( value varchar2(500) path '$.myjsonkey')) b

但这只返回一个值列表,没有相应的键。 json数据总是字符串 - 双键值。

感谢

EDIT 为了添加更多的上下文,我现在在postgres中使用json_each执行此操作,并且我正在Oracle中寻找类似的方法。

3 个答案:

答案 0 :(得分:1)

尝试一下:

declare
  jo JSON_OBJECT_T;
  i  NUMBER;
  keys JSON_KEY_LIST;
  CURSOR c_json IS
     SELECT myJsonCol FROM mytable;
begin
  FOR rec IN c_json
  LOOP
     jo := JSON_OBJECT_T.parse(rec.myJsonCol);
     keys := jo.get_keys;
     dbms_output.put_line('KEY VAL');
     FOR i in 1..keys.COUNT
     LOOP
        dbms_output.put_line(keys(i) || ' ' || jo.get_Number(keys(i)));
     END LOOP;
   END LOOP;
END;
/

答案 1 :(得分:0)

您的JSON值是单个元组,因此您可以使用UNPIVOT将其转换为键/值对表:

with mydata as (
  select '{
  "a":9.0847,
  "b":859.947
  }' myjsoncol
  from dual
), q as (
  select json_value(mydata.myjsoncol, '$.a') ca
        ,json_value(mydata.myjsoncol, '$.b') cb
  from mydata
) select * from q
unpivot (val for key in (ca as 'a', cb as 'b'));

KEY VAL
=== =======
a   9.0847
b   859.947

Live SQL:https://livesql.oracle.com/apex/livesql/s/d31n9re90y6cpghi4i3m9hfoh

答案 2 :(得分:-1)

对于Oracle 11g版本,不支持Json操作。因此,我们必须使用基本功能:SUBSTR / INSTR / SUBSTR

在另一个线程上检查解决方案:Manipulating JSON data with SQL in Oracle