sqladvanced
Array and UNNEST Operations
Work with array columns using UNNEST, ARRAY_AGG, and array operators in PostgreSQL.
sqlPress ⌘/Ctrl + Shift + C to copy
-- Array columns
CREATE TABLE articles (
id SERIAL PRIMARY KEY,
title TEXT,
tags TEXT[] DEFAULT '{}'
);
INSERT INTO articles (title, tags) VALUES
('Intro to SQL', ARRAY['sql', 'beginner', 'database']),
('Advanced Postgres', ARRAY['sql', 'postgres', 'advanced']);
-- Array contains value
SELECT * FROM articles WHERE 'sql' = ANY(tags);
-- Array overlap
SELECT * FROM articles WHERE tags && ARRAY['react', 'postgres'];
-- UNNEST to rows
SELECT id, title, UNNEST(tags) AS tag FROM articles;
-- Count tag frequency
SELECT tag, COUNT(*) AS usage_count
FROM articles, UNNEST(tags) AS tag
GROUP BY tag ORDER BY usage_count DESC;
-- ARRAY_AGG
SELECT department,
ARRAY_AGG(DISTINCT name ORDER BY name) AS members
FROM employees GROUP BY department;
-- Append / remove
UPDATE articles SET tags = tags || 'featured' WHERE id = 1;
UPDATE articles SET tags = ARRAY_REMOVE(tags, 'beginner') WHERE id = 1;Use Cases
- tag systems
- multi-value columns
- denormalized data
Tags
Related Snippets
Similar patterns you can reuse in the same workflow.
sqlbeginner
INSERT ... RETURNING for Immediate Results
Use RETURNING clause to get inserted rows immediately without a separate SELECT query.
Best for: getting generated IDs
#sql#insert
sqladvanced
Row-Level Security Policies
Enforce data access rules at the database level with PostgreSQL Row-Level Security policies.
Best for: Multi-tenant databases
#security#rls
sqladvanced
Table Partitioning by Range
Partition large tables by date range for faster queries and easier data lifecycle management.
Best for: Time-series data
#partitioning#performance
sqlintermediate
Deferred Foreign Key Constraints
Defer constraint checking to transaction commit for circular references and batch operations.
Best for: Circular references
#constraints#transactions