JSON_TABLE을 사용하여 Oracle JSON 열에서 Key Value를 결과 집합으로 가져오는 방법
구글 검색을 많이 했는데 간단한 사용 사례에 대한 간단한 해결책을 찾을 수 없는 것 같습니다.저는 오라클 12C 데이터베이스에 json 열을 가지고 있고(물론 json 제약 조건이 있는 varchar), 그 열에 이렇게 맵의 표현을 저장합니다.
{
"a":9.0847,
"b":859.947
}
plsql에서 다음과 같은 결과 집합을 반환하고 싶습니다.
key val
a 9.0847
b 859.947
저는 아래와 같이 무한대로 변형된 것으로 보이며, 모든 예는 제 사용 사례에 비해 너무 작위적입니다.
select b.* from mytable a,json_table(myJsonCol,'$'
columns ( value varchar2(500) path '$.myjsonkey')) b
이 경우 값 목록만 반환되며, 해당 키는 반환되지 않습니다.json 데이터는 항상 문자열 이중 키 값입니다.
감사해요.
EDIT 좀 더 문맥을 추가하기 위해, 저는 지금 이것을 하기 위해 포스트그레스에서 json_each를 사용하고, 오라클에서 비슷한 방법을 찾고 있습니다.
다음은 SQL 내에서 PL/SQL API를 사용하는 18c와 21c에서 시도한 일반적인 솔루션입니다.WITH
원하는 출력을 생성할 수 있는 기능(물론 이 기능을 저장할 수도 있습니다):
with
function json_keys(j varchar2) return clob as
jo json_object_t;
k json_key_list;
r clob;
begin
jo := json_object_t(j);
k := jo.get_keys();
select coalesce(
json_arrayagg(column_value returning clob),
json_array(returning clob)
)
into r
from table (k);
return r;
end;
select o, json_keys(o)
from (
select '{}' as o from dual union all
select '{"a":1}' from dual union all
select '{"a":1,"b":2}' from dual
) t;
결과:
|O |JSON_KEYS(O)|
|-------------|------------|
|{} |[] |
|{"a":1} |["a"] |
|{"a":1,"b":2}|["a","b"] |
시도해 보기:
declare
jo JSON_OBJECT_T;
i NUMBER;
keys JSON_KEY_LIST;
CURSOR c_json IS
SELECT myJsonCol FROM mytable;
begin
FOR rec IN c_json
LOOP
jo := JSON_OBJECT_T.parse(rec.myJsonCol);
keys := jo.get_keys;
dbms_output.put_line('KEY VAL');
FOR i in 1..keys.COUNT
LOOP
dbms_output.put_line(keys(i) || ' ' || jo.get_Number(keys(i)));
END LOOP;
END LOOP;
END;
/
JSON 값은 단일 튜플이므로 UNPIVOT를 사용하여 키/값 쌍의 테이블로 변환할 수 있습니다.
with mydata as (
select '{
"a":9.0847,
"b":859.947
}' myjsoncol
from dual
), q as (
select json_value(mydata.myjsoncol, '$.a') ca
,json_value(mydata.myjsoncol, '$.b') cb
from mydata
) select * from q
unpivot (val for key in (ca as 'a', cb as 'b'));
KEY VAL
=== =======
a 9.0847
b 859.947
실시간 SQL: https://livesql.oracle.com/apex/livesql/s/d31n9re90y6cpghi4i3m9hfoh
Oracle 11g 버전 Json 조작은 지원되지 않습니다.그래서 기본적인 기능인 SUBSTER / INSTR / SUBSTER을 사용해야 합니다.
다른 스레드에서 솔루션 확인 : Oracle에서 SQL로 JSON 데이터 조작
언급URL : https://stackoverflow.com/questions/40424591/how-to-get-key-value-as-resultset-from-oracle-json-column-using-json-table
'programing' 카테고리의 다른 글
DbCommand 및 매개 변수화된 SQL, ORACLE 대 SQL Server (0) | 2023.10.14 |
---|---|
이진 파일을 무시하는 PowerShell 검색 스크립트 (0) | 2023.10.14 |
python에서 사용자 지정 메시지로 오류를 던지고 종료하는 방법 (0) | 2023.10.14 |
하나의 테이블에서 다른 테이블로 여러 필드 (0) | 2023.10.14 |
갤러리에서 안드로이드 이미지 선택 (0) | 2023.10.14 |