在Oracle SQL中更新JSON数据

发布于 2025-02-12 10:06:09 字数 397 浏览 0 评论 0 原文

这是我的JSON数据中的一个oracle SQL列之一“ JSONCOL”的表中的一个名为“ JSontable”的表中,

{
  "Company": [
    {
      "Info": {
        "Address": "123"
      },
      "Name": "ABC",
      "Id": 999
    },
    {
      "Info": {
        "Address": "456"
      },
      "Name": "XYZ",
      "Id": 888
    }
  ]
}

我正在寻找 update> update 查询以更新具有基于新值的“名称”的所有值在特定的“ ID”值上。 提前致谢

This is my json data in one of the oracle sql columns "jsoncol" in a table named "jsontable"

{
  "Company": [
    {
      "Info": {
        "Address": "123"
      },
      "Name": "ABC",
      "Id": 999
    },
    {
      "Info": {
        "Address": "456"
      },
      "Name": "XYZ",
      "Id": 888
    }
  ]
}

I am looking for an UPDATE query to update all the value of "Name" with a new value based on a particular "Id" value.
Thanks in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

送你一个梦 2025-02-19 10:06:10

在Oracle 19中,您可以使用 JSON_MERGEPATCH

UPDATE jsontable j
SET   jsoncol = JSON_MERGEPATCH(
                  jsoncol,
                  (
                    SELECT JSON_OBJECT(
                             KEY 'Company'
                             VALUE JSON_ARRAYAGG(
                                     CASE id
                                     WHEN 999
                                     THEN JSON_MERGEPATCH(
                                            json,
                                            '{"Name":"DEF"}'
                                          )
                                     ELSE json
                                     END
                                     FORMAT JSON
                                     RETURNING CLOB
                                   )
                             FORMAT JSON
                             RETURNING CLOB
                             )
                    FROM   jsontable jt
                           CROSS APPLY JSON_TABLE(
                             jt.jsoncol,
                             '$.Company[*]'
                             COLUMNS(
                               json VARCHAR2(4000) FORMAT JSON PATH '

对于示例数据:

CREATE TABLE jsontable (
  jsoncol CLOB CHECK (jsoncol IS JSON)
);

INSERT INTO jsontable (jsoncol)
VALUES ('{
  "Company": [
    {
      "Info": {
        "Address": "123"
      },
      "Name": "ABC",
      "Id": 999
    },
    {
      "Info": {
        "Address": "456"
      },
      "Name": "XYZ",
      "Id": 888
    }
  ]
}');

然后,在更新之后,该表包含:

jsoncol
{“ company”:[{“ info”:{“ address”:“ 123”},“ name”:“ def”:“ def”,“ id”:999},{ “ info”:{“ address”:“ 456”},“名称”:“ xyz”,“ id”:888}]}

db<> fiddle 在这里

, id NUMBER PATH '$.Id' ) ) WHERE jt.ROWID = j.ROWID ) )

对于示例数据:


然后,在更新之后,该表包含:

jsoncol
{“ company”:[{“ info”:{“ address”:“ 123”},“ name”:“ def”:“ def”,“ id”:999},{ “ info”:{“ address”:“ 456”},“名称”:“ xyz”,“ id”:888}]}

db<> fiddle 在这里

From Oracle 19, you can use JSON_MERGEPATCH:

UPDATE jsontable j
SET   jsoncol = JSON_MERGEPATCH(
                  jsoncol,
                  (
                    SELECT JSON_OBJECT(
                             KEY 'Company'
                             VALUE JSON_ARRAYAGG(
                                     CASE id
                                     WHEN 999
                                     THEN JSON_MERGEPATCH(
                                            json,
                                            '{"Name":"DEF"}'
                                          )
                                     ELSE json
                                     END
                                     FORMAT JSON
                                     RETURNING CLOB
                                   )
                             FORMAT JSON
                             RETURNING CLOB
                             )
                    FROM   jsontable jt
                           CROSS APPLY JSON_TABLE(
                             jt.jsoncol,
                             '$.Company[*]'
                             COLUMNS(
                               json VARCHAR2(4000) FORMAT JSON PATH '

Which, for the sample data:

CREATE TABLE jsontable (
  jsoncol CLOB CHECK (jsoncol IS JSON)
);

INSERT INTO jsontable (jsoncol)
VALUES ('{
  "Company": [
    {
      "Info": {
        "Address": "123"
      },
      "Name": "ABC",
      "Id": 999
    },
    {
      "Info": {
        "Address": "456"
      },
      "Name": "XYZ",
      "Id": 888
    }
  ]
}');

Then after the UPDATE, the table contains:

JSONCOL
{"Company":[{"Info":{"Address":"123"},"Name":"DEF","Id":999},{"Info":{"Address":"456"},"Name":"XYZ","Id":888}]}

db<>fiddle here

, id NUMBER PATH '$.Id' ) ) WHERE jt.ROWID = j.ROWID ) )

Which, for the sample data:


Then after the UPDATE, the table contains:

JSONCOL
{"Company":[{"Info":{"Address":"123"},"Name":"DEF","Id":999},{"Info":{"Address":"456"},"Name":"XYZ","Id":888}]}

db<>fiddle here

短暂陪伴 2025-02-19 10:06:10

您可以在 replace()中使用 json_table()函数,以更新 name 的值(来自 abc to def )对于特定的ID值( 999 ),例如

UPDATE jsontable jt0
   SET jsoncol = ( SELECT REPLACE(jsoncol,jt.name,'DEF') 
                     FROM jsontable j,
                          JSON_TABLE(jsoncol,
                                    '

19那个身份表和JSON值的值( ID )在整个表和每个单独的JSON值中都是唯一的。

COLUMNS(NESTED PATH '$.Company[*]' COLUMNS( name VARCHAR2 PATH '$.Name', id INT PATH '$.Id' ) ) ) jt WHERE jt.id = 999 AND j.id = jt0.id )

19那个身份表和JSON值的值( ID )在整个表和每个单独的JSON值中都是唯一的。

You can use REPLACE() within JSON_TABLE() function in order to update the value of the Name(from ABC to DEF) for a specific Id value(999) such as

UPDATE jsontable jt0
   SET jsoncol = ( SELECT REPLACE(jsoncol,jt.name,'DEF') 
                     FROM jsontable j,
                          JSON_TABLE(jsoncol,
                                    '

for the DB version prior to 19 provided that the identity values(id) of the table and of the JSON values are unique throughout the table and each individual JSON value, respectively.

Demo

COLUMNS(NESTED PATH '$.Company[*]' COLUMNS( name VARCHAR2 PATH '$.Name', id INT PATH '$.Id' ) ) ) jt WHERE jt.id = 999 AND j.id = jt0.id )

for the DB version prior to 19 provided that the identity values(id) of the table and of the JSON values are unique throughout the table and each individual JSON value, respectively.

Demo

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文