【问题标题】:How to get Key Value as resultset from Oracle JSON column using JSON_TABLE如何使用 JSON_TABLE 从 Oracle JSON 列中获取键值作为结果集
【发布时间】:2021-04-03 19:39:43
【问题描述】:

我用谷歌搜索了很多,但似乎无法为我的简单用例找到简单的解决方案。 我在 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 数据总是字符串双键值。

谢谢

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

【问题讨论】:

  • 解决办法是什么?
  • @RaviShankar 我从来没有找到过,必须跟踪各种对象类型的键并单独使用它
  • 你是怎么做到的?您是否能够在一列中获取所有键?
  • @RaviShankar 不,我们最终将键存储在另一个表中,但是您使用列存储它们的想法可能会实现相同的效果.. 问题是保持它们一致
  • 可能,您可以使用链接中给出的术语:link

标签: json oracle


【解决方案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;
/

【讨论】:

    【解决方案2】:

    您的 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
    

    实时 SQL:https://livesql.oracle.com/apex/livesql/s/d31n9re90y6cpghi4i3m9hfoh

    【讨论】:

    • 谢谢,但问题是我不知道 a 和 b 作为键存在....所有数据都有可能不同的字段作为映射中的键。
    【解决方案3】:

    对于 Oracle 11g 版本,不支持 Json 操作。所以我们必须使用基本函数:SUBSTR / INSTR / SUBSTR

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多