使用其他表中的键在Oracle中进行动态JSON解析
我需要帮助从存储在oracle表中的JSON列中提取数据。JSON数据列最多可以有10个键,并且can键数可以从1到10不等。我必须使用元数据表中存储的列名以关系表格式创建视图,并创建读取列数据的动态查询使用其他表中的键在Oracle中进行动态JSON解析,json,oracle,Json,Oracle,我需要帮助从存储在oracle表中的JSON列中提取数据。JSON数据列最多可以有10个键,并且can键数可以从1到10不等。我必须使用元数据表中存储的列名以关系表格式创建视图,并创建读取列数据的动态查询 CREATE TABLE json_species ( id NUMBER NOT NULL PRIMARY KEY, info CLOB CONSTRAINT is_json CHECK (info IS JSON ) ) / CREATE TABLE js
CREATE TABLE json_species
(
id NUMBER NOT NULL PRIMARY KEY,
info CLOB CONSTRAINT is_json CHECK (info IS JSON ) )
/
CREATE TABLE json_species_props
(
Props varchar(100)
)
BEGIN
INSERT INTO json_species
VALUES (1, '{"name":"Spider"}');
INSERT INTO json_species
VALUES (2, '{"name":"Elephant", "trunk_length":"10"}');
INSERT INTO json_species
VALUES (3, '{"name":"Shark", "fin_count":"4"}');
Insert into json_species_props values ('name')
Insert into json_species_props values ('trunk_length')
Insert into json_species_props values ('fincount')
COMMIT;
END;
我需要以下关系格式的输出
Name Trunk_length fincount
Spider NULL NULL
Elephant 10 NULL
Shark NULL 4
由于我不熟悉JSON数据提取,请提供指导假设您使用的是12.2或更高版本,最简单的方法是使用。有了它,您可以创建一个视图,为您进行JSON->relational转换。不需要单独的属性表 为此,首先创建一个JSON搜索索引:
create search index json_species_i
on json_species ( info )
for json
parameters ( 'dataguide on' );
然后创建视图:
exec dbms_json.create_view_on_path ( 'species', 'json_species', 'info', '$' );
select * from species;
ID INFO$name INFO$fin_count INFO$trunk_length
1 Spider <null> <null>
2 Elephant <null> 10
3 Shark 4 <null>
如果愿意,还可以使用此选项将标量属性公开为虚拟列:
exec dbms_json.add_virtual_columns ( 'json_species', 'info' );
select * from json_species;
ID INFO NAME INFO$fin_count INFO$trunk_length
1 {"name":"Spider"} Spider <null> <null>
2 {"name":"Elephant", "trunk_length":"10"} Elephant <null> 10
3 {"name":"Shark", "fin_count":"4"} Shark 4 <null>
exec dbms_json.add_virtual_列('json_species','info');
从json_物种中选择*;
ID信息名称信息$fin\u计数信息$trunk\u长度
1{“名称”:“蜘蛛”}蜘蛛
2{“名称”:“大象”,“躯干长度”:“10}大象10
3{“姓名”:“鲨鱼”,“鳍数”:“4}鲨鱼4
你能提供你想要的json输出吗?@RobertoHernandez抱歉,我已经更新了我的查询,很好的捕获;我错过了电话。谢谢@apcsthanker@ChrisSaxon,但是不是在所有现有的as数据上创建,而是可以从另一个表驱动它为什么?可以使用此方法从视图/表中选择所需的属性。当然,您可以自己滚动,但您必须使用动态SQL-如果使用json\u value
或类似方法,则路径必须是文本文本。我的json列长度可变,对于某些列,它可以有3个键,而对于某些列,它可以有10个键。我想创建一个视图,其中有20列的列名(键)来自不同的元数据表。如果添加了new,我将只更新元数据表中的第11列,而不是10列,我将开始获得第11列,而其他9列保持为NULL,如果有人重命名,我将只添加第12列,如果有人插入具有新属性的JSON文档,我将显示prev和current value,您只需再次调用这些过程,数据库将根据需要重新创建视图/虚拟列
exec dbms_json.add_virtual_columns ( 'json_species', 'info' );
select * from json_species;
ID INFO NAME INFO$fin_count INFO$trunk_length
1 {"name":"Spider"} Spider <null> <null>
2 {"name":"Elephant", "trunk_length":"10"} Elephant <null> 10
3 {"name":"Shark", "fin_count":"4"} Shark 4 <null>