With JSON support available in Oracle 12c, it is possible to define views on JSON data.
Background
Complex JSON documents do not have to be queried completely every time, and views can provide an easy way to define an important subset of the JSON documents’ content. The relational database management system Oracle 12c implements the view mechanism for SQL and that is available for JSON columns as well.
In the following a few JSON document view examples are discussed on and implemented. Views are defined as well as accessed, directly queried as well as part of other SQL statements.
Example Data Set
First, an example data set is introduced around people living in cities and data about these cities.
DROP TABLE people; CREATE TABLE people ( id NUMBER, person CLOB CONSTRAINT person_ensure_json CHECK (person IS JSON (STRICT WITH UNIQUE KEYS))); INSERT INTO people VALUES ( 1, '{ "name": "Bob", "city": "SF"}'); INSERT INTO people VALUES ( 2, '{ "name": "Jake", "city": "PA"}'); INSERT INTO people VALUES ( 3, '{ "name": "Alice", "city": "NYC"}'); INSERT INTO people VALUES ( 4, '{ "name": "Jenn", "city": "Tokyo"}'); INSERT INTO people VALUES ( 5, '{ "name": "Frank", "city": "Berlin"}'); INSERT INTO people VALUES ( 6, '{ "name": "Jup", "city": "Paris"}');
DROP TABLE cities; CREATE TABLE cities ( id NUMBER, city CLOB CONSTRAINT city_ensure_json CHECK (city IS JSON (STRICT WITH UNIQUE KEYS))); INSERT INTO cities VALUES (101, '{"city": {"name": "SF", "population": 837442, "area": 121.4}, "state": "CA", "country": "US"}'); INSERT INTO cities VALUES (102, '{"city": {"name": "PA", "population": 64403, "area": 66.787}, "state": "CA", "country": "US"}'); INSERT INTO cities VALUES (103, '{"city": {"name": "NYC", "population": 8405837, "area": 783.8}, "state": "NY", "country": "US"}'); INSERT INTO cities VALUES (104, '{"city": {"name": "Tokyo", "population": 9071577, "area": 622.99}, "state": null, "country": "Japan"}'); INSERT INTO cities VALUES (105, '{"city": {"name": "Paris", "population": 10869000, "area": 2845}, "state": null, "country": "France"}'); INSERT INTO cities VALUES (106, '{"city": {"name": "Berlin", "population": 3517424, "area": 891.75}, "state": null, "country": "Germany"}');
Views
A few example views and possible uses are discussed in the following. The results of the queries are displayed in graphical representation provided by SQLDeveloper.
Simple View
CREATE OR REPLACE VIEW all_cities AS SELECT DISTINCT c.city.city.name FROM cities c;
SELECT * FROM all_cities;
SELECT p.person FROM people p, all_cities all_c WHERE p.person.city = all_c.city;
SELECT p.person.name, all_c.city FROM people p, all_cities all_c WHERE p.person.city = all_c.city;
View Definition with Predicate
CREATE OR REPLACE VIEW us_cities AS SELECT DISTINCT c.city.city.name FROM cities c WHERE c.city.country = 'US';
SELECT * FROM us_cities;
SELECT p.person.name, us_c.city FROM people p, us_cities us_c WHERE p.person.city = us_c.city;
View Definition with Computation
CREATE OR REPLACE VIEW city_stats AS SELECT c.city.city.name AS name, ROUND(c.city.city.population / c.city.city.area, 2) AS population_density FROM cities c;
SELECT * FROM city_stats;
SELECT p.person.name, c_s.name, c_s.population_density FROM people p, city_stats c_s WHERE p.person.city = c_s.name ORDER BY c_s.population_density DESC;
Summary
The benefit of having JSON support in a relational database management system is that mechanisms and operations beyond querying are available with views being one. It is clear that the ability to define views is important, from a data model and data semantics perspective as well as from a data security and developer convenience viewpoint.
Go SQL!
Disclaimer
The views expressed on this blog are my own and do not necessarily reflect the views of Oracle.