SQL NESTED Clause Instead of JSON_TABLE in Oracle Database 19c
The SQL NESTED clause allows us to write the equivalent of the LEFT OUTER JOIN JSON_TABLE using a simplified syntax.
oracle 19cconfigurationintermediate
by OracleDba
15 views
The SQL NESTED clause allows us to write the equivalent of the LEFT OUTER JOIN JSON_TABLE using a simplified syntax.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
--DROP TABLE json_documents PURGE;
CREATE TABLE json_documents (
id RAW(16) NOT NULL,
data CLOB,
CONSTRAINT json_documents_pk PRIMARY KEY (id),
CONSTRAINT json_documents_json_chk CHECK (data IS JSON)
);
INSERT INTO json_documents (id, data)
VALUES (SYS_GUID(),
'{
"FirstName" : "John",
"LastName" : "Doe",
"Job" : "Clerk",
"Address" : {
"Street" : "99 My Street",
"City" : "My City",
"Country" : "UK",
"Postcode" : "A12 34B"
},
"ContactDetails" : {
"Email" : "[email protected]",
"Phone" : "44 123 123456",
"Twitter" : "@johndoe"
},
"DateOfBirth" : "01-JAN-1980",
"Active" : true
}');
INSERT INTO json_documents (id, data)
VALUES (SYS_GUID(),
'{
"FirstName" : "Jayne",
"LastName" : "Doe",
"Job" : "Manager",
"Address" : {
"Street" : "100 My Street",
"City" : "My City",
"Country" : "UK",
"Postcode" : "A12 34B"
},
"ContactDetails" : {
"Email" : "[email protected]",
"Phone" : ""
},
"DateOfBirth" : "01-JAN-1982",
"Active" : false
}');
INSERT INTO json_documents (id, data)
VALUES (SYS_GUID(), NULL);
COMMIT;
EXEC DBMS_STATS.gather_table_stats(USER, 'json_documents');123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
SET LINESIZE 120
COLUMN first_name FORMAT A10
COLUMN last_name FORMAT A10
COLUMN job FORMAT A10
COLUMN email FORMAT A21
COLUMN phone FORMAT A14
COLUMN active FORMAT A6
SELECT j.id, jt.first_name, jt.last_name, jt.job, jt.email, jt.phone, jt.active
FROM json_documents j,
JSON_TABLE(j.data, '$'
COLUMNS (first_name VARCHAR2(50 CHAR) PATH FirstName,
last_name VARCHAR2(50 CHAR) PATH LastName,
job VARCHAR2(10 CHAR) PATH Job,
email VARCHAR2(100 CHAR) PATH ContactDetails.Email,
phone VARCHAR2(50 CHAR) PATH ContactDetails.Phone,
active VARCHAR2(5 CHAR) PATH Active)) jt;
ID FIRST_NAME LAST_NAME JOB EMAIL PHONE ACTIVE
-------------------------------- ---------- ---------- ---------- --------------------- -------------- ------
82D1C9BC1499407EE055000000000001 John Doe Clerk [email protected] 44 123 123456 true
82D1C9BC149A407EE055000000000001 Jayne Doe Manager [email protected] false
SQL>
SELECT j.id, jt.first_name, jt.last_name, jt.job, jt.email, jt.phone, jt.active
FROM json_documents j JOIN
JSON_TABLE(j.data, '$'
COLUMNS (first_name VARCHAR2(50 CHAR) PATH FirstName,
last_name VARCHAR2(50 CHAR) PATH LastName,
job VARCHAR2(10 CHAR) PATH Job,
email VARCHAR2(100 CHAR) PATH ContactDetails.Email,
phone VARCHAR2(50 CHAR) PATH ContactDetails.Phone,
active VARCHAR2(5 CHAR) PATH Active)) jt ON 1=1;
ID FIRST_NAME LAST_NAME JOB EMAIL PHONE ACTIVE
-------------------------------- ---------- ---------- ---------- --------------------- -------------- ------
82D1C9BC1499407EE055000000000001 John Doe Clerk [email protected] 44 123 123456 true
82D1C9BC149A407EE055000000000001 Jayne Doe Manager [email protected] false
SQL>
SELECT j.id, jt.first_name, jt.last_name, jt.job, jt.email, jt.phone, jt.active
FROM json_documents j
LEFT OUTER JOIN
JSON_TABLE(j.data, '$'
COLUMNS (first_name VARCHAR2(50 CHAR) PATH FirstName,
last_name VARCHAR2(50 CHAR) PATH LastName,
job VARCHAR2(10 CHAR) PATH Job,
email VARCHAR2(100 CHAR) PATH ContactDetails.Email,
phone VARCHAR2(50 CHAR) PATH ContactDetails.Phone,
active VARCHAR2(5 CHAR) PATH Active)) jt ON 1=1;
ID FIRST_NAME LAST_NAME JOB EMAIL PHONE ACTIVE
-------------------------------- ---------- ---------- ---------- --------------------- -------------- ------
82D1C9BC1499407EE055000000000001 John Doe Clerk [email protected] 44 123 123456 true
82D1C9BC149A407EE055000000000001 Jayne Doe Manager [email protected] false
82D1C9BC149B407EE055000000000001
SQL>1234567891011121314151617181920212223242526272829303132333435363738
SELECT j.id, jt.first_name, jt.last_name, jt.job, jt.email, jt.phone, jt.active
FROM json_documents j
NESTED data
COLUMNS (first_name VARCHAR2(50 CHAR) PATH FirstName,
last_name VARCHAR2(50 CHAR) PATH LastName,
job VARCHAR2(10 CHAR) PATH Job,
email VARCHAR2(100 CHAR) PATH ContactDetails.Email,
phone VARCHAR2(50 CHAR) PATH ContactDetails.Phone,
active VARCHAR2(5 CHAR) PATH Active) jt;
ID FIRST_NAME LAST_NAME JOB EMAIL PHONE ACTIVE
-------------------------------- ---------- ---------- ---------- --------------------- -------------- ------
82D1C9BC1499407EE055000000000001 John Doe Clerk [email protected] 44 123 123456 true
82D1C9BC149A407EE055000000000001 Jayne Doe Manager [email protected] false
82D1C9BC149B407EE055000000000001
SQL>
SELECT j.id, jt.first_name, jt.last_name, jt.job, jt.email, jt.phone, jt.active
FROM json_documents j
NESTED data
COLUMNS (first_name VARCHAR2(50 CHAR) PATH FirstName,
last_name VARCHAR2(50 CHAR) PATH LastName,
job VARCHAR2(10 CHAR) PATH Job,
active VARCHAR2(5 CHAR) PATH Active,
NESTED PATH ContactDetails COLUMNS
(
email VARCHAR2(100 CHAR) PATH Email,
phone VARCHAR2(50 CHAR) PATH Phone
)) jt;
ID FIRST_NAME LAST_NAME JOB EMAIL PHONE ACTIVE
-------------------------------- ---------- ---------- ---------- --------------------- -------------- ------
82D1C9BC1499407EE055000000000001 John Doe Clerk [email protected] 44 123 123456 true
82D1C9BC149A407EE055000000000001 Jayne Doe Manager [email protected] false
82D1C9BC149B407EE055000000000001
SQL>Please to add comments
No comments yet. Be the first to comment!