Oracle SQL:JSON 表;获取数组的大小
Posted
技术标签:
【中文标题】Oracle SQL:JSON 表;获取数组的大小【英文标题】:Oracle SQL : JSON_TABLE ; Get sized of Array 【发布时间】:2021-05-21 07:23:01 【问题描述】:我想知道是否有办法获取 JSON 数据中特定节点的数组大小。
例如,下面是 JSON。
对于节点“电话”,有两个项目。我想知道这个节点的大小。 我的目标是将 Java 数组解析为 Java 数组。 如果我不知道数组的大小,我将无法解析。
基本上我想得到值“2”。
"PONumber" : 1600,
"Reference" : "ABULL-20140421",
"Requestor" : "Alexis Bull",
"User" : "ABULL",
"CostCenter" : "A50",
"ShippingInstructions" : "name" : "Alexis Bull",
"Address": "street" : "200 Sporting Green",
"city" : "South San Francisco",
"state" : "CA",
"zipCode" : 99236,
"country" : "United States of America",
"Phone" : ["type" : "Office", "number" : "909-555-7307",
"type" : "Mobile", "number" : "415-555-1234"],
"Special Instructions" : null,
"AllowPartialShipment" : true,
"LineItems" : ["ItemNumber" : 1,
"Part" : "Description" : "One Magic Christmas",
"UnitPrice" : 19.95,
"UPCCode" : 13131092899,
"Quantity" : 9.0,
"ItemNumber" : 2,
"Part" : "Description" : "Lethal Weapon",
"UnitPrice" : 19.95,
"UPCCode" : 85391628927,
"Quantity" : 5.0]
作为替代方案,使用下面的代码我会得到该数据:
SELECT jt.phones
FROM j_purchaseorder,
JSON_TABLE(po_document, '$.ShippingInstructions'
COLUMNS
(phones VARCHAR2(100) FORMAT JSON PATH '$.Phone')) AS jt;
但是如果我使用
SELECT jt.phones
FROM j_purchaseorder,
JSON_TABLE(po_document, '$'
COLUMNS
(ShippingInstructions VARCHAR2(100) FORMAT JSON PATH '$.ShippingInstructions')) AS jt;
我得到的值为 null。 那么我怎样才能在单个值中获取整个 ShippingInstructions。
【问题讨论】:
对于表示,我提到了 100,但也尝试了 1000,但仍然是同样的问题。 db<>fiddle 【参考方案1】:对于节点“电话”,有两个项目。我想知道这个节点的大小。
基本上我想得到值“2”。
来自this question和this question,你可以使用:
SELECT jt.phones
FROM j_purchaseorder,
JSON_TABLE(
po_document,
'$.ShippingInstructions'
COLUMNS (
phones VARCHAR2(100) FORMAT JSON WITH WRAPPER PATH '$.Phone.size()'
)
) AS jt;
哪些输出:
PHONES [2]
如果您不想要数组包装器,则可以通过JSON_VALUE
传递返回值:
SELECT JSON_VALUE(jt.phones, '$[0]') AS phones
FROM j_purchaseorder,
JSON_TABLE(
po_document,
'$.ShippingInstructions'
COLUMNS (
phones VARCHAR2(100) FORMAT JSON WITH WRAPPER PATH '$.Phone.size()'
)
) AS jt;
哪些输出:
PHONES 2
如果您是 Oracle 19c 并且您的列是使用 IS JSON
检查约束定义的,那么您可以将查询简化为:
SELECT j.po_document."ShippingInstructions"."Phone".size() phones
FROM j_purchaseorder j;
哪些输出:
PHONES 2
如果您使用的是不支持size()
函数的早期Oracle 版本,那么您可以获取所有行并使用COUNT
:
SELECT COUNT(*) AS phones
FROM j_purchaseorder,
JSON_TABLE(
po_document,
'$.ShippingInstructions.Phone[*]'
COLUMNS (
phones VARCHAR2(100) FORMAT JSON PATH '$'
)
) AS jt;
哪些输出:
PHONES 2
db小提琴here
【讨论】:
以上是关于Oracle SQL:JSON 表;获取数组的大小的主要内容,如果未能解决你的问题,请参考以下文章
ORACLE JSON_TABLE 我需要从数组中获取 2 列
zbb20170816 oracle Oracle 查看表空间数据文件的大小及使用情况sql语句
ASP.NET + SQL SERVER + JSON = 如何在 SQL Server 的两个连接表中获取数据并加载为 JSON?