Optionnalité avec JSON_ARRAY_ELEMENTS

ExempleLEFT JOIN JSON_ARRAY_ELEMENTS

1
INSERT INTO Personne
2
VALUES (
3
1,
4
'Holmes',
5
'Sherlock',
6
'[
7
{"numéro":221,"rue":"rue du boulanger", "cp":60200, "ville":"Compiègne"},
8
{"numéro":0,"rue":"rue Secrète", "cp":60200, "ville":"Compiègne"}
9
]'
10
);
11
12
INSERT INTO Personne
13
VALUES (
14
2,
15
'Watson',
16
'John'
17
);
1
 sk |  nom   |  prénom  |                                  adresse                                  
2
----+--------+----------+---------------------------------------------------------------------------
3
 1  | Holmes | Sherlock | [                                                                        +
4
    |        |          | {"numéro":221,"rue":"rue du boulanger", "cp":60200, "ville":"Compiègne"},+
5
    |        |          | {"numéro":0,"rue":"rue Secrète", "cp":60200, "ville":"Compiègne"}        +
6
    |        |          | ]
7
 2  | Watson | John     | 
8

Remarque

1
SELECT a->>a1, a->>a2... FROM t, JSON_ARRAY_ELEMENTS(t.jsonatt) a

équivalent à

1
SELECT a->>a1, a->>a2... FROM t JOIN JSON_ARRAY_ELEMENTS(t.jsonatt) a ON TRUE

AttentionL'opérateur JSON_ARRAY_ELEMENTS agit comme une jointure

1
SELECT p.nom, p.prénom, CAST(ad->>'numéro' AS INTEGER) AS numéro, ad->>'rue' AS rue, ad->>'ville' AS ville
2
FROM personne p JOIN JSON_ARRAY_ELEMENTS(p.adresse) ad ON TRUE
1
  nom   |  prénom  | numéro |       rue        |   ville   
2
--------+----------+--------+------------------+-----------
3
 Holmes | Sherlock |    221 | rue du boulanger | Compiègne
4
 Holmes | Sherlock |      0 | rue Secrète      | Compiègne

SyntaxeConvertir un tableau optionnel d'objets JSON en relationnel : opérateurs LEFT JOIN JSON_ARRAY_ELEMENTS et ->>

1
SELECT a->>a1, a->>a2... FROM t LEFT JOIN JSON_ARRAY_ELEMENTS(jsonatt) a on TRUE

ExempleL'opérateur JSON_ARRAY_ELEMENTS agit comme une jointure

1
SELECT p.nom, p.prénom, CAST(ad->>'numéro' AS INTEGER) AS numéro, ad->>'rue' AS rue, ad->>'ville' AS ville
2
FROM personne p LEFT JOIN JSON_ARRAY_ELEMENTS(p.adresse) ad ON TRUE
1
  nom   |  prénom  | numéro |       rue        |   ville   
2
--------+----------+--------+------------------+-----------
3
 Holmes | Sherlock |    221 | rue du boulanger | Compiègne
4
 Holmes | Sherlock |      0 | rue Secrète      | Compiègne
5
 Watson | John     |        |                  |