Direct naar de hoofdinhoud
Module 15 · Les 1 van 256/57 in de cursus~15 min
Modulelessen (1/2)

JSON- en JSONB-integratie

JSON- en JSONB-integratie

PostgreSQL herschreef de regels van databases door het geruststellende, oerdegelijke ACID-karakter van SQL te combineren met de dynamische, vloeiende flexibiliteit die typisch is voor NoSQL. Dit gebeurde door kolommen aan te bieden die oorspronkelijk bedoeld waren voor het opslaan van JSON-gegevens.

Let op: in Postgres wordt het bijna altijd aanbevolen om JSONB te gebruiken. De "B" staat voor Binair: JSON-documenten die in deze kolommen zijn opgeslagen, verliezen hun puur tekstuele opmaak, maar ze kunnen worden gevalideerd, opgevraagd met zeer hoge prestaties, gemanipuleerd en zelfs geïndexeerd met de klassieke B-boom of GIN INDEX.

Navigeren door JSON: de "Pijl"-operator

Helaas heeft de database ecommerce momenteel geen vooraf gedefinieerde pure JSON-kolommen. We kunnen echter tijdelijke JSON-waarden maken en deze vanuit tekst "casten"!

Bij het werken met JSON zijn de operators die inzoomen op objecten en arrays -> (bewaart de gegevens in de pure jsonb/json-vorm) of de "uitgebreide" versie ->> (converteert de aangetroffen JSON-gegevens naar tekst).

Academisch voorbeeld, alsof er een JSON-kolom met 'metagegevens' bestond:

SQL
-- Look up the value associated with the info key
SELECT metadata->'info' FROM users;

-- Drill into info, and grab city as text
SELECT metadata->'info'->>'city' FROM users;
Oefening#sql.m15.l1.e1
Pogingen: 0Laden…

Laten we JSON direct opvragen. Projecteer deze letterlijke json \`'{"user": {"name": "Mario"}}'::json\` en gebruik de \`->\` operator in combinatie met de tekstversie (\`->>\`) om 'name' te extraheren, waarbij de geëxtraheerde kolom 'user_name' wordt genoemd.

Editor laden…
Toon hint

Cast naar ::json of ::jsonb, en gebruik ->'user'->>'name'.

Oplossing beschikbaar na 3 pogingen

Oefening#sql.m15.l1.e2
Pogingen: 0Laden…

Wat als we een array doorgeven? Arraytoegang in json_b in Postgres werkt via INDEX (op nul gebaseerd). Extraheer het SECOND-element als tekst uit \`'["A", "B", "C"]'::json\` en noem het 'letter'.

Editor laden…
Toon hint

->>1 (het is op nul gebaseerd!)

Oplossing beschikbaar na 3 pogingen