gpt4 book ai didi

sql - 如何使用新属性值更新 JSON 列?

转载 作者:行者123 更新时间:2023-12-04 16:27:02 27 4
gpt4 key购买 nike

我有一种情况,我需要在我的表中动态更新 json 列。请参阅下面的结构

create table tjson ( jsoncol CLOB CONSTRAINT tjson_chk CHECK (jsoncol IS JSON) );    

insert into tjson (jsoncol) VALUES ( '{"name" : "Kunal", "LName" : "Vohra" ,
"salary" : "10000", "Age" : "25"}');

insert into tjson (jsoncol) VALUES ( '{"name" : "Rahul", "LName" : "Sharma" ,
"salary" : "20000", "Age" : "35"}');

现在我需要在some_condition

的基础上将 salary更改为完整表格的动态值

我可以使用 JSON_VALUE(jsoncol, '$.Age')

读取数据
update tjson 
set jsoncol = '"salary":$JustChangeSalary'
where some_condition;

工资是动态的,不是固定的。我愿意只改变薪水。

我尝试了 json_mergepatch,但这仅适用于 Oracle 版本 19。我们使用的是 Oracle 12.2 版

最佳答案

json_mergepatch 之前,您可以使用 replace 等基本字符串函数。

但是您需要注意这些 - 格式差异可能会导致这些失败。您也可以更新符合您的条件的多个属性。

您可以在纯 SQL 中安全地执行以下操作:

  • 使用 json_table
  • 将 JSON 对象转换为行和列
  • 使用 json_object(agg)json_array(agg) 重构文档,根据需要传递新值。

例如:

create table tjson ( 
jsoncol CLOB CONSTRAINT tjson_chk CHECK (jsoncol IS JSON)
);

insert into tjson (jsoncol) VALUES (
'{"name" : "Kunal", "LName" : "Vohra" , "salary" : "10000", "Age" : "25"}'
);

insert into tjson (jsoncol) VALUES (
'{"name" : "Rahul", "LName" : "Sharma" , "salary" : "20000", "Age" : "35"}'
);

commit;

select json_object (
'name' value j.name,
'LName' value j.LName,
'salary' value 30000, -- put new salary here
'Age' value j.Age
)
from tjson, json_table (
jsoncol, '$'
columns (
name path '$.name',
LName path '$.LName',
Age int path '$.Age'
)
) j
where j.name = 'Kunal';

JSON_OBJECT('NAME'VALUEJ.NAME,'LNAME'VALUEJ.LNAME,'SALARY'VALUE30000,--PUTNEWSALARYHERE'AGE'VALUEJ.AGE)
{"name":"Kunal","LName":"Vohra","salary":30000,"Age":25}

select t.jsoncol.name, t.jsoncol.salary
from tjson t;

NAME SALARY
Kunal 10000
Rahul 20000


update tjson t
set jsoncol = (
select json_object (
'name' value j.name,
'LName' value j.LName,
'salary' value 30000, -- put new salary here
'Age' value j.Age
)
from tjson, json_table (
jsoncol, '$'
columns (
name path '$.name',
LName path '$.LName',
Age int path '$.Age'
)
) j
where t.jsoncol.name = j.name
)
where t.jsoncol.name = 'Kunal';

select t.jsoncol.name, t.jsoncol.salary
from tjson t;

NAME SALARY
Kunal 30000
Rahul 20000

显然这……很麻烦!这对于复杂的文档是不切实际的。

幸运的是,从 12.2 开始,您可以使用 PL/SQL 对象类型操作 JSON 文档:

declare
jdoc tjson.jsoncol%type;
jobj json_object_t;
begin
select t.jsoncol
into jdoc
from tjson t
where t.jsoncol.name = 'Kunal';

jobj := json_object_t.parse ( jdoc );
jobj.put ( 'salary', 40000 );
jdoc := jobj.to_clob();

update tjson t
set jsoncol = jdoc
where t.jsoncol.name = 'Kunal';
end;
/

select t.jsoncol.name, t.jsoncol.salary
from tjson t;

NAME SALARY
Kunal 40000
Rahul 20000

关于sql - 如何使用新属性值更新 JSON 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61933141/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com