Oracle - Разбор нескольких JSON значений в одном запросе SQL - PullRequest
1 голос
/ 10 апреля 2020

У меня есть данные в таблице 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"    : "john.doe@example.com",
                          "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;

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Вы можете использовать предложение 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"    : "john.doe@example.com",
                          "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   john.doe@example.com 44 123 123456
1 голос
/ 10 апреля 2020
with PersonalDetails (jsn) as (
select '{
      "FirstName"      : "John",
      "LastName"       : "Doe",
      "Job"            : "Clerk",
      "Address"        : {
                          "Street"   : "99 My Street",
                          "City"     : "My City",
                          "Country"  : "UK",
                          "Postcode" : "A12 34B"
                         },
      "ContactDetails" : {
                          "Email"    : "john.doe@example.com",
                          "Phone"    : "44 123 123456",
                          "Twitter"  : "@johndoe"
                         },
      "DateOfBirth"    : "01-JAN-1980",
      "Active"         : true
}' from dual
)
select jt.* from PersonalDetails, json_table (
  PersonalDetails.jsn, '$' 
  COLUMNS
  Firstname VARCHAR2(30) PATH '$.FirstName',
  Address  VARCHAR2(255) PATH '$.Address.Street',
  City     VARCHAR2(255) PATH '$.Address.City',
  Country  VARCHAR2(255) PATH '$.Address.Country',
  Postcode VARCHAR2(255) PATH '$.Address.Postcode',
  dob      VARCHAR2(11) PATH '$.DateOfBirth',
  email    VARCHAR2(50) PATH '$.ContactDetails.Email'
) jt;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...