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

Exemple

Description

@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

RappelReprésentation équivalente

Description

@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"}

SyntaxeObtenir 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

AttentionForcer 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