【问题标题】:How to remove a JSON node using Oracle's JSON functions如何使用 Oracle 的 JSON 函数删除 JSON 节点
【发布时间】:2017-11-08 23:20:50
【问题描述】:

我在 Oracle 数据库的 VARCHAR2 列中有如下 JSON 字符串。

{
  "name": "Bob",
  "age": "20",
  "extras": {
    "address": "123 Main St"
  }
}

我想从 JSON 字符串中删除“extras”节点并返回结果,如:

{
  "name": "Bob",
  "age": "20"
}

我已经知道如何使用 Oracle JSON 函数(如 json_value, json_table, json_query)解析 JSON 字符串的片段。不幸的是,我被困在 Oracle 12.1 上,所以我不能使用像 json_object, json_aggobject 这样的函数,这些函数是在 12.2 中添加的。

我尝试使用类似json_query(data, '$["name"]["age"]')(参见this)的路径语法,但Oracle 似乎不支持这种路径语法。

我可以通过从原始对象中显式提取每个已知键并使用串联重新组合来解决此问题,例如:

select '{"name":"' || json_value(data,'$.name') 
     ||'","age":"' || json_value(data,'$.age') || '"}' result
from (
    select '{"name":"Bob","age":"20","extras":{"address":"123 Main St"}}' data
    from dual);

但我想一般地这样做,这样我就不会将键硬编码到 SQL 表达式中(我希望将来可能会添加其他键)。

如何在我的 SQL 语句中不硬编码键列表而仅删除“附加”节点?

【问题讨论】:

    标签: json oracle


    【解决方案1】:

    在 oracle 12.2 中,您可以执行新调用来删除它。在下面的步骤中,我构建您的字符串,输出它,删除“附加”并再次输出:

    SET SERVEROUTPUT ON
    DECLARE
      l_obj JSON_OBJECT_T;
    BEGIN
      -- New empty object using constructor.
      -- With or without the NEW keyword.
      l_obj := JSON_OBJECT_T();
      DBMS_OUTPUT.put_line('l_obj.stringify = ' || l_obj.stringify);
      l_obj := NEW JSON_OBJECT_T();
      DBMS_OUTPUT.put_line('l_obj.stringify = ' || l_obj.stringify);
    
     -- New object based on some JSON text using constructor.
     -- With or without the NEW keyword.
      l_obj := JSON_OBJECT_T('{
      "name": "Bob",
      "age": "20",
      "extras": {
      "address": "123 Main St"
      }
    }');
      DBMS_OUTPUT.put_line('l_obj.stringify = ' || l_obj.stringify);
    
      -- remove "extras"
      l_obj.remove('extras');
      DBMS_OUTPUT.put_line('l_obj.stringify = ' || l_obj.stringify);
    END;
    /
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多