sql - Oracle - 在单个 SQL 查询中解析多个 JSON 值

标签 sql json oracle

我的 PersonalDetails 表中有 JSON 格式的数据,我正在尝试在单个查询中解析数据,目前我正在使用 JSON_TABLE 函数,在我的查询中,如果我尝试使用,我只能解析一列JSON_TABLE 函数两次它抛出一个错误,它们是解析单个查询中所有列的方法吗?或者除了 JSON_TABLE 之外还有其他功能吗?

示例数据

{
      "FirstName"      : "John",
      "LastName"       : "Doe",
      "Job"            : "Clerk",
      "Address"        : {
                          "Street"   : "99 My Street",
                          "City"     : "My City",
                          "Country"  : "UK",
                          "Postcode" : "A12 34B"
                         },
      "ContactDetails" : {
                          "Email"    : "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b3d9dcdbdd9dd7dcd6f3d6cbd2dec3dfd69dd0dcde" rel="noreferrer noopener nofollow">[email protected]</a>",
                          "Phone"    : "44 123 123456",
                          "Twitter"  : "@johndoe"
                         },
      "DateOfBirth"    : "01-JAN-1980",
      "Active"         : true
}  

我的查询

SELECT 
FirstName,
LastName,
Job,
Street,
City,
Country,
Postcode,
ContactDetails,
DateOfBirth,
Active
FROM
JSON_TABLE(tab.Address, '$' COLUMNS
    ( Address VARCHAR(255) PATH '$.Street',
        City VARCHAR(255) PATH '$.City',
        Country VARCHAR(255) PATH '$.Country',
        Postcode VARCHAR(255) PATH '$.Postcode',
    )) JT,
    PersonalDetails tab;

最佳答案

您可以使用NESTED子句:

with PersonalDetails (data) as (
select
'{
      "FirstName"      : "John",
      "LastName"       : "Doe",
      "Job"            : "Clerk",
      "Address"        : {
                          "Street"   : "99 My Street",
                          "City"     : "My City",
                          "Country"  : "UK",
                          "Postcode" : "A12 34B"
                         },
      "ContactDetails" : {
                          "Email"    : "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e48e8b8c8aca808b81a4819c8589948881ca878b89" rel="noreferrer noopener nofollow">[email protected]</a>",
                          "Phone"    : "44 123 123456",
                          "Twitter"  : "@johndoe"
                         },
      "DateOfBirth"    : "01-JAN-1980",
      "Active"         : true
}' 
from dual
)
SELECT jt.*
FROM PersonalDetails,
 JSON_TABLE(data, '$'
   COLUMNS (FirstName VARCHAR2(50), LastName VARCHAR2(50), Job, Active,
   NESTED ContactDetails COLUMNS (Email VARCHAR2(100), Phone)
   )
) jt;

输出:

FIRSTNAME  LASTNAME JOB   ACTIVE EMAIL                PHONE
---------- -------- ----- ------ -------------------- ---------------
John       Doe      Clerk true   <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="472d282f296923282207223f262a372b226924282a" rel="noreferrer noopener nofollow">[email protected]</a> 44 123 123456

关于sql - Oracle - 在单个 SQL 查询中解析多个 JSON 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61142090/

相关文章:

c# - 如何通过参数化存储过程填充列表框?

sql - 如何在 Perl 的 DBI 中为可变 SQL 函数使用占位符?

sql - SQL 中的代码重用和模块化

json - 在 Go 中处理 JSON Post 请求 - 错误

oracle - SQL Developer 不显示 dbms_output

windows - tnsping ping 失败,即使我可以成功连接到数据库

sql - 2 列在一张表中有 2 个不同的条件

c# - JSON 数组到 Entity Framework Core 非常慢?

c++ - libjson 是否支持 64 位 int 类型?

sql - 如何查看oracle数据库中一个表的所有列的元数据?