我有一张表,其中一列有json数组数据。在某些行中,此json非常大(带有10000+个json对象),如下所示。想知道有什么方法可以从数组中选择前250个对象-
[{“产品”:“蔬菜”,“ name”:“土豆”,“价格”:“ $ 60.00”},{“ product”:“水果”,“ name”:“ Mango”,“价格”:“ $ 3.30”},{“产品”:“牛奶”,“ name”:“牛奶”,“价格”:“ $ 1.08”},..... 10,000]
我仔细研究了这个问题,发现可以使用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
条目的列表。
可以在子查询中使用诸如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