如何从值而不是键修改 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","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;