Postgres 9.1 added FOREACH
to loop over arrays:
DO
$do$
DECLARE
_arr int[] := '{1,2,3,4}';
_elem int; -- matching element type
BEGIN
FOREACH _elem IN ARRAY _arr
LOOP
RAISE NOTICE '%', _elem;
END LOOP;
END
$do$;
db<>fiddle here
Works for multi-dimensional arrays, too: Postgres flattens the array and iterates over all elements. To loop over slices, see link below.
For older versions:
FOR i IN 1 .. array_upper(_arr, 1) -- "i" is the index
LOOP
RAISE NOTICE '%', _arr[i]; -- single quotes
END LOOP;
For multi-dimensional arrays and looping over array slices see:
- Loop over array dimension in plpgsql
However, set-based solutions with generate_series()
or unnest()
are often faster than looping over big sets. Basic examples:
- PostgreSQL: Frequency Table Expansion
- Select each month between a start and end date