我已经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中寻找类似的方法。
答案 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