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 列

SQl 在整数和 json 数组上加入表格以获取整数

oracle数据库如何查看表空间大小

zbb20170816 oracle Oracle 查看表空间数据文件的大小及使用情况sql语句

创建sql表并读取json数组中的值

ASP.NET + SQL SERVER + JSON = 如何在 SQL Server 的两个连接表中获取数据并加载为 JSON?