oracle-从json数组中获取前n个json对象

问题描述 投票:0回答:2

我有一张表,其中一列有json数组数据。在某些行中,此json非常大(带有10000+个json对象),如下所示。想知道有什么方法可以从数组中选择前250个对象-

[{“产品”:“蔬菜”,“ name”:“土豆”,“价格”:“ $ 60.00”},{“ product”:“水果”,“ name”:“ Mango”,“价格”:“ $ 3.30”},{“产品”:“牛奶”,“ name”:“牛奶”,“价格”:“ $ 1.08”},..... 10,000]

json oracle oracle12c
2个回答
0
投票

我仔细研究了这个问题,发现可以使用json_query从JSON中选择单个条目。

CREATE TABLE json_table ( JSON varchar(1024) NOT NULL , constraint CK_JSON_IS_JSON check (JSON is json));

insert into json_table columns (JSON) values ('[ { "product":"Vegetable", "name":"Potato", "price":"$60.00" }, { "product":"Fruit", "name":"Mango", "price":"$3.30" }, { "product":"Milk", "name":"Milk", "price":"$1.08" }]');

select json_query(JSON, '$[0]'), 
       json_query(JSON, '$[1]'), 
       json_query(JSON, '$[2]'), 
       json_query(JSON, '$[3]') 
from json_table;

这将选择条目0到3,其中3未找到并且为NULL。

[您可能可以将数据库存储过程缝合在一起,以返回JSON中第一个n条目的列表。


0
投票

可以在子查询中使用诸如ROW_NUMBER()之类的解析函数来确定限制,然后可以添加JSON_ARRAYAGG()JSON_OBJECT()组合以返回简化数组:

SELECT JSON_ARRAYAGG(
                     JSON_OBJECT('product' VALUE product, 
                                 'name'    VALUE name,
                                 'price'   VALUE price) )
  FROM
  (
   SELECT t.*, ROW_NUMBER() OVER (ORDER BY 1) AS rn
     FROM tab
    CROSS JOIN
     JSON_TABLE(jsdata, '$[*]' COLUMNS (
                 product VARCHAR(100) PATH '$.product',
                 name    VARCHAR(100) PATH '$.name',
                 price   VARCHAR(100) PATH '$.price'
                )
     ) t
   )
 WHERE rn <= 250 
© www.soinside.com 2019 - 2024. All rights reserved.