Attributs composés (datatype) en R-JSON (->>)
Exemple :

@startuml
hide circle
class Adresse <<dataType>> {
numéro : integer
rue : text
cp : integer
ville : text
}
class Personne {
nom : text
prénom : text
adresse : Adresse
}
@enduml
Rappel : Représentation équivalente

@startuml
hide circle
class Adresse {
numéro : integer
rue : text
cp : integer
ville : text
}
class Personne {
nom : text
prénom : text
}
Personne *- "1" Adresse : " "
@enduml
Une représentation avec datatype est équivalente à une composition 1:1.
Exemple :
1
CREATE TABLE Personne (
2
sk TEXT PRIMARY KEY,
3
nom TEXT NOT NULL,
4
prénom TEXT NOT NULL,
5
adresse JSON NOT NULL
6
);
1
INSERT INTO Personne
2
VALUES (
3
1,
4
'Holmes',
5
'Sherlock',
6
'{"numéro":221,"rue":"rue du boulanger", "cp":60200, "ville":"Compiègne"}'
7
);
1
sk | nom | prénom | adresse
2
----+--------+----------+--------------------------------------------------------------------------
3
1 | Holmes | Sherlock | {"numéro":221,"rue":"rue du boulanger", "cp":60200, "ville":"Compiègne"}
Syntaxe : Obtenir une valeur d'un objet JSON : opérateur ->>('key')
1
SELECT jsonatt->>'key' FROM t
Renvoie la valeur correspondant à la clé key
située à la racine du JSON.
Exemple :
1
SELECT nom, prénom, adresse->>'ville' AS ville
2
FROM Personne;
1
nom | prénom | ville
2
--------+----------+-----------
3
Holmes | Sherlock | Compiègne
Attention : Forcer les types (CAST)
Les attributs sont retournés comme des chaînes, pour obtenir d'autre types, il faut utiliser la fonction CAST.
1
SELECT nom, prénom, CAST(adresse->>'numéro' AS INTEGER) AS numéro, adresse->>'rue' AS rue
2
FROM Personne;
1
nom | prénom | numéro | rue
2
--------+----------+--------+------------------
3
Holmes | Sherlock | 221 | rue du boulanger