Json_types
Chapter 49: JSON & JSONB Data Types
Section titled “Chapter 49: JSON & JSONB Data Types”Working with Semi-Structured Data
Section titled “Working with Semi-Structured Data”49.1 JSON vs JSONB
Section titled “49.1 JSON vs JSONB”PostgreSQL supports two JSON data types with different characteristics.
JSON Types Comparison ========================================================================
┌─────────────────────────────────────────────────────────────────────┐ │ JSON vs JSONB │ │ │ │ JSON: │ │ ───── │ │ • Stores exact text │ │ • Preserves whitespace │ │ • Faster write, slower read │ │ • Duplicate keys allowed │ │ │ │ JSONB: │ │ ────── │ │ • Stores parsed binary │ │ • No whitespace preserved │ │ • Slower write, faster read │ │ • No duplicate keys │ │ • Supports indexing │ │ │ │ Recommendation: Use JSONB for most use cases │ │ │ └─────────────────────────────────────────────────────────────────────┘49.2 Creating JSON Tables
Section titled “49.2 Creating JSON Tables”-- Create table with JSONB columnCREATE TABLE events ( event_id SERIAL PRIMARY KEY, event_name VARCHAR(200), payload JSONB, created_at TIMESTAMP DEFAULT NOW());
-- Insert JSON dataINSERT INTO events (event_name, payload) VALUES ('user_signup', '{"user_id": 1, "email": "john@example.com", "source": "web"}'), ('order_placed', '{"order_id": 100, "items": ["a", "b", "c"], "total": 99.99}'), ('page_view', '{"url": "/home", "user_id": 1, "duration": 30}');
-- Query JSON dataSELECT event_name, payload->>'user_id' as user_idFROM events;49.3 JSON Operators
Section titled “49.3 JSON Operators”-- Extract value (-> returns JSON, ->> returns text)SELECT payload->>'email' FROM events WHERE event_name = 'user_signup';SELECT payload->'items' FROM events WHERE event_name = 'order_placed';
-- Nested extractionSELECT payload->'user'->>'name' FROM events;
-- Path extraction (#>)SELECT payload#>>'{user,name}' FROM events;
-- Containment (@>)SELECT * FROM events WHERE payload @> '{"user_id": 1}';
-- Has key (?)SELECT * FROM events WHERE payload ? 'user_id';
-- Contains any keys (?|)SELECT * FROM events WHERE payload ?| array['user_id', 'order_id'];49.4 JSONB Indexing
Section titled “49.4 JSONB Indexing”-- Create GIN index for JSONBCREATE INDEX idx_events_payload ON events USING GIN(payload);
-- Create index for specific pathCREATE INDEX idx_events_user_id ON events ((payload->>'user_id'));
-- Use index for containment queriesEXPLAIN SELECT * FROM events WHERE payload @> '{"user_id": 1}';49.5 JSON Functions
Section titled “49.5 JSON Functions”-- Convert row to JSONSELECT row_to_json(orders) FROM orders LIMIT 1;
-- Convert array to JSONSELECT jsonb_agg(name) FROM products;
-- Build JSON objectSELECT jsonb_build_object('name', 'John', 'age', 30);
-- Build JSON arraySELECT jsonb_build_array(1, 2, 3);
-- Convert JSON array to rowsSELECT * FROM jsonb_array_elements_text('["a", "b", "c"]');
-- Pretty printSELECT jsonb_pretty(payload) FROM events;Summary
Section titled “Summary”| Operator | Returns | Use |
|---|---|---|
| -> | JSON | Get by key |
| ->> | Text | Get as text |
| @> | Bool | Contains |
| ? | Bool | Has key |