Working with Arrays

1. Creating Array Columns

CREATE TABLE posts (
   id   bigserial PRIMARY KEY,
   tags text[] NOT NULL DEFAULT '{}',
   scores int[][]      -- multidimensional
);
SyntaxMeaning
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;
DetailNote
Indexing1-based
Out-of-boundsReturns 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

OperatorMeaning
@>Contains
<@Contained by
&&Overlap
||Concat
= ANY(arr)Element-of test

7. Using Array Functions

FunctionUse
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'];
IndexSupports
GIN@>, <@, &&, = ANY
btreeEquality on whole array only