<!--
Les sources pour ce sujet sont :

* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=de3600452b61d1bc3967e9e37e86db8956c8f577

Discussion: https://postgr.es/m/cd0bb935-0158-78a7-08b5-904886deac4b@postgrespro.ru
Discussion: https://postgr.es/m/20220616233130.rparivafipt6doj3@alap3.anarazel.de
Discussion: https://postgr.es/m/abd9b83b-aa66-f230-3d6d-734817f0995d%40postgresql.org
Discussion: https://postgr.es/m/CA+HiwqE4XTdfb1nW=Ojoy_tQSRhYt-q_kb6i5d4xcKyrLC1Nbg@mail.gmail.com

-->

<div class="slide-content">

  * Conversion d'une donnée `JSON` en vue
  * Clause `NESTED PATH`
    
</div>

<div class="notes">

Une nouvelle fonction permet de présenter des données `JSON` sous forme de vue.
Cette fonction a été dénommée `JSON_TABLE()`. Le premier paramètre que prend
la fonction, appelé `context_item`, est une source `JSON` sur laquelle sera
évaluée l'expression `JSON`. Il est possible de récupérer des données présentes
dans une structure imbriquée, avec la clause `NESTED PATH`.

Prenons l'exemple suivant d'une table créée à partir d'un fichier `JSON`.

```sql
postgres=# create table t1 (log json);
CREATE TABLE
postgres=# copy t1(log) from '/tmp/data.json' ;
COPY 12
```

Voici un exemple d'une ligne contenue dans la table `t1` :

```json
{"guid":"c39c493b-6759-47b8-9c3f-10b1b59ba8ef","isActive":false,"balance":"$3,363.44","age":23,"name":"Claudine Howell","gender":"female","email":"claudinehowell@aquasseur.com","address":"482 Fiske Place, Ogema, Pennsylvania, 1753","registered":"2023-12-22T05:16:27 -01:00","latitude":-88.430942,"longitude":34.196733}
```

Si l'on souhaite récupérer une vue avec uniquement les informations de l'âge et
du nom présents dans les lignes de la table `t1`, la commande suivante peut être utilisée : 

```sql
postgres=# select resultats.* from t1, JSON_TABLE(log, '$' COLUMNS (age int PATH '$.age', name text PATH '$.name')) as resultats;
 age |        name        
-----+--------------------
  23 | Claudine Howell
  34 | Ingram Buchanan
  21 | Jensen Jacobs
  28 | Nadia Merritt
  35 | Ashley Mckenzie
  28 | Louella Berry
  21 | Mooney Thompson
  26 | Marquez Orr
  23 | Sharp Mcdowell
  39 | Letitia Workman
  25 | Madeleine Mcintyre
  24 | Wheeler Glass
(12 rows)
```

* `JSON_TABLE(log, '$'` indique que toute la source `JSON` doit être utilisée
  lors de l'évaluation ;
* `COLUMNS (age int PATH '$.age', name text PATH '$.name'))` est la clause qui
  permet d'indiquer les colonnes présentes dans la vue résultante et
  où retrouver les données associées ;
* La clause `PATH` indique l'emplacement de la donnée dans la donnée `JSON`.

Le résultat peut être manipulé comme habituellement et donc utilisé, par
exemple, pour la création d'une table :

```sql
create table t2 as select resultats.* from t1, JSON_TABLE(log, '$' COLUMNS (age int PATH '$.age', name text PATH '$.name', balance text PATH '$.balance' )) as resultats;

postgres=# \d t2
                 Table "public.t2"
 Column  |  Type   | Collation | Nullable | Default 
---------+---------+-----------+----------+---------
 age     | integer |           |          | 
 name    | text    |           |          | 
 balance | text    |           |          | 
```

Voici un autre exemple avec des données imbriquées. Le but est de retrouver
tous les noms des amis de chacune des personnes.

```json
{"name1":"Roach Crosby","friends":[{"id":0,"name":"Deloris Wilkerson"},{"id":1,"name":"Pitts Lambert"},{"id":2,"name":"Alicia Myers"}]}
```

```sql
postgres=# create table t3 (log json);
CREATE TABLE
postgres=# copy t3(log) from '/tmp/data2.json';
COPY 5
```

L'expression d'évaluation `JSON` est légèrement plus complexe : 

```sql
postgres=# select resultats.* from t3, JSON_TABLE(log, '$' COLUMNS ( name_1 text PATH '$.name1',  NESTED PATH '$.friends[*]' COLUMNS ( name_2 text PATH '$.name' ))) as resultats;
     name_1     |       name_2        
----------------+---------------------
 Roach Crosby   | Deloris Wilkerson
 Roach Crosby   | Pitts Lambert
 Roach Crosby   | Alicia Myers
 Petty Goodwin  | Mandy Baldwin
 Petty Goodwin  | Jordan Fitzgerald
 Petty Goodwin  | Pickett Glenn
 Alyssa Campos  | Margaret Harrington
 Alyssa Campos  | Ofelia Robinson
 Alyssa Campos  | Mccarthy Conway
 Bernard French | Leon Byers
 Bernard French | Sellers Macias
 Bernard French | Madge Barron
 Willa Bell     | Bauer Burton
 Willa Bell     | Wade Cameron
 Willa Bell     | Queen Cardenas
(15 rows)
```

</div>
