TransWikia.com

Как выбрать значения из столбца вида {"key1":value1,"key2":value2, } в PL/SQL?

Stack Overflow на русском Asked on January 15, 2021

Как выбрать значения из столбца, который выглядит так:

{"key1":"value1","key2":"value2","key3":"value3", }

Свободный перевод вопроса Select values from column like {"key1":value1,"key2":value2, } in PLSQL от участника Andrey

2 Answers

Для работы с JSON в PL/SQL доступны, кроме некоторых SQL функций,
также набор обьектных типов. Вот решение на чистом PL/SQL (db<>fiddle):

create or replace package arrpack as
    type pairr is record (key varchar2 (8), value varchar2 (8));
    type pairt is table of pairr;
    type jdoct is table of varchar2 (4000);
end;
/
var rc refcursor
declare
    jdoc arrpack.jdoct := 
        arrpack.jdoct ('{"key1":"value1","key2":"value2","key3":"value3"}');
    pairs arrpack.pairt := arrpack.pairt ();  
    keys json_key_list;
    jobj json_object_t;
begin 
    jobj := json_object_t (jdoc(1));
    keys := jobj.get_keys;
    pairs.extend (keys.count); 
    for ix in 1 .. keys.count loop
        pairs(ix) := arrpack.pairr (keys(ix), jobj.get_string (keys(ix)));
    end loop;
    open :rc for select * from table (pairs);
end;
/

Результат:

KEY      VALUE   
-------- --------
key1     value1  
key2     value2  
key3     value3  

Answered by 0xdb on January 15, 2021

Это выглядит как JSON. Если это действительно так, то такой пример покажет, как это сделать (заметьте, что нужен Oracle 12c или выше):

create table t (col varchar2 (100));
    
alter table t add constraint ch_json check (col is json);
    
insert into t values ('{"key1":"value1","key2":"value2","key3":"value3", }');
    
select json_value(col, '$.key1')as value, col from t;

Результат:

VALUE    COL                                                   
-------- ------------------------------------------------------
value1   {"key1":"value1","key2":"value2","key3":"value3", }   

Свободный перевод ответа от участника @Littlefoot

Answered by 0xdb on January 15, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP