Working with Arrays
1. Creating Array Columns
CREATE TABLE posts (
id bigserial PRIMARY KEY,
tags text[] NOT NULL DEFAULT '{}',
scores int[][] -- multidimensional
);
| Syntax | Meaning |
|---|---|
| type[] | 1-D array of any type |
| type[3] | Size annotation (not enforced) |
| type[][] | Multi-dim (rectangular) |
2. Inserting Array Data
INSERT INTO posts(tags) VALUES (ARRAY['sql','perf']);
INSERT INTO posts(tags) VALUES ('{"intro","first"}');
3. Accessing Array Elements
SELECT tags[1], tags[array_length(tags,1)] FROM posts;
| Detail | Note |
|---|---|
| Indexing | 1-based |
| Out-of-bounds | Returns NULL |
4. Updating Array Elements
UPDATE posts SET tags[1] = 'lead' WHERE id = 1;
UPDATE posts SET tags = tags || 'extra' WHERE id = 1;
UPDATE posts SET tags = array_remove(tags, 'old') WHERE id = 1;
5. Querying Array Contents
SELECT * FROM posts WHERE 'sql' = ANY(tags);
SELECT * FROM posts WHERE tags @> ARRAY['sql','perf']; -- contains all
SELECT * FROM posts WHERE tags && ARRAY['sql','db']; -- overlap
6. Using Array Operators
| Operator | Meaning |
|---|---|
| @> | Contains |
| <@ | Contained by |
| && | Overlap |
| || | Concat |
| = ANY(arr) | Element-of test |
7. Using Array Functions
| Function | Use |
|---|---|
| array_length(a, dim) | Length |
| cardinality(a) | Total elements |
| array_position(a, x) | First index of x |
| array_to_string(a, sep) | Join |
| array_dims(a) | Dimensions |
8. Using array_append and array_prepend
SELECT array_append(ARRAY[1,2], 3); -- {1,2,3}
SELECT array_prepend(0, ARRAY[1,2]); -- {0,1,2}
9. Using array_cat
SELECT array_cat(ARRAY[1,2], ARRAY[3,4]); -- {1,2,3,4}
10. Using array_remove and array_replace
SELECT array_remove(ARRAY[1,2,3,2], 2); -- {1,3}
SELECT array_replace(ARRAY[1,2,3,2], 2, 9); -- {1,9,3,9}
11. Unnesting Arrays
SELECT id, t.tag FROM posts, unnest(tags) AS t(tag);
SELECT * FROM unnest(ARRAY[10,20,30]) WITH ORDINALITY AS u(val, idx);
12. Using Array Aggregation
SELECT customer_id, array_agg(id ORDER BY placed_at) AS order_ids
FROM orders GROUP BY customer_id;
13. Using Array Slicing
SELECT (ARRAY[10,20,30,40,50])[2:4]; -- {20,30,40}
SELECT tags[1:3] FROM posts;
14. Using Multidimensional Arrays
SELECT (ARRAY[[1,2],[3,4]])[2][1]; -- 3
SELECT array_dims(ARRAY[[1,2],[3,4]]); -- [1:2][1:2]
Warning: Multidim arrays must be rectangular; ragged shapes raise an error.
15. Creating GIN Index on Arrays
CREATE INDEX posts_tags_gin ON posts USING gin (tags);
EXPLAIN ANALYZE SELECT * FROM posts WHERE tags @> ARRAY['sql'];
| Index | Supports |
|---|---|
| GIN | @>, <@, &&, = ANY |
| btree | Equality on whole array only |