如何从值而不是键修改 json 数组的值(Oracle,PL SQL)?
How to modify a value of a json array from a value but not from a key (Oracle, PL SQL)?
- 我想将值“4444”更改为“7727”
- 知道我只有旧值 ('4444') 和新值 ('7727') 而没有密钥
["4444","5555"]
修改后
["7727","5555"]
您可以在 JSON_TABLE
:
中使用 FOR ORDINALITY
SELECT *
FROM table_name t
CROSS APPLY JSON_TABLE(
t.json,
'$[*]'
COLUMNS
idx FOR ORDINALITY,
value NUMBER PATH '$'
);
其中,对于示例数据:
CREATE TABLE table_name (id NUMBER PRIMARY KEY, json JSON);
INSERT INTO table_name (id, json)
SELECT 1, '["4444","5555"]' FROM DUAL;
输出:
ID
JSON
IDX
VALUE
1
["4444","5555"]
1
4444
1
["4444","5555"]
2
5555
注意:如果希望索引从0开始那么减1。
如果你想获得 PL/SQL 中的值,那么你可以使用 JSON_ARRAY_T
:
DECLARE
ja JSON_ARRAY_T := JSON_ARRAY_T.PARSE('["4444","5555"]');
BEGIN
FOR i IN 0 .. ja.get_size - 1 LOOP
DBMS_OUTPUT.PUT_LINE( ja.get_number(i) || ' = ' || i );
END LOOP;
END;
/
输出:
4444 = 0
5555 = 1
db<>fiddle here
这是我创建的一个函数,用于从不是键的值修改 json 数组的值(旧值 = '4444',新值 = '7727')
nmr_cmpt_json := JSON_ARRAY_T.parse(nmrs_cmpts_tab);
i := 0;
loop
exit when i> nmr_cmpt_json.get_Size ;
if nmr_cmpt_json.get_String(i) = '4444' then
nmr_cmpt_json.put(i, '7727', TRUE);
nmrs_cmpts_tab:= nmr_cmpt_json .to_string;
dbms_output.put_line( 'nmr_cmpt_json = ' || nmr_cmpt_json.stringify);
exit;
end if;
i := i +1;
end loop;
- 我想将值“4444”更改为“7727”
- 知道我只有旧值 ('4444') 和新值 ('7727') 而没有密钥
["4444","5555"]
修改后
["7727","5555"]
您可以在 JSON_TABLE
:
FOR ORDINALITY
SELECT *
FROM table_name t
CROSS APPLY JSON_TABLE(
t.json,
'$[*]'
COLUMNS
idx FOR ORDINALITY,
value NUMBER PATH '$'
);
其中,对于示例数据:
CREATE TABLE table_name (id NUMBER PRIMARY KEY, json JSON);
INSERT INTO table_name (id, json)
SELECT 1, '["4444","5555"]' FROM DUAL;
输出:
ID JSON IDX VALUE 1 ["4444","5555"] 1 4444 1 ["4444","5555"] 2 5555
注意:如果希望索引从0开始那么减1。
如果你想获得 PL/SQL 中的值,那么你可以使用 JSON_ARRAY_T
:
DECLARE
ja JSON_ARRAY_T := JSON_ARRAY_T.PARSE('["4444","5555"]');
BEGIN
FOR i IN 0 .. ja.get_size - 1 LOOP
DBMS_OUTPUT.PUT_LINE( ja.get_number(i) || ' = ' || i );
END LOOP;
END;
/
输出:
4444 = 0 5555 = 1
db<>fiddle here
这是我创建的一个函数,用于从不是键的值修改 json 数组的值(旧值 = '4444',新值 = '7727')
nmr_cmpt_json := JSON_ARRAY_T.parse(nmrs_cmpts_tab);
i := 0;
loop
exit when i> nmr_cmpt_json.get_Size ;
if nmr_cmpt_json.get_String(i) = '4444' then
nmr_cmpt_json.put(i, '7727', TRUE);
nmrs_cmpts_tab:= nmr_cmpt_json .to_string;
dbms_output.put_line( 'nmr_cmpt_json = ' || nmr_cmpt_json.stringify);
exit;
end if;
i := i +1;
end loop;