Ещё когда только пришёл в проект, в котором предполагалось много и занудно писать на PL/pgSQL, написал две элементарные функции. И все спрашивали - да зачем оно надо... Однако сейчас используют широко и говорят спасибо.
Первая является агрегатом (как min, max, avg, sum и подобные) и собирает столбец в массив. Ну а дальше с помощью PL/pgSQL его можно обрабатывать. Используется в SELECT clause. Объявляется так:
CREATE AGGREGATE col_to_arr(BASETYPE = anyelement, SFUNC = array_append, STYPE = anyarray, INITCOND = '{}' );
Вторая решает обратную задачу - представляет массив как столбец. Используется в FROM clause.
1 create or replace function "arr_to_col"(arr anyarray)
2 returns setof anyelement as
3 $$
4 declare
5 size int;
6 index int;
7 begin
8 select array_upper(arr,1) into size;
9 for index in 1..size loop
10 return next arr[index];
11 end loop;
12 return;
13 end
14 $$
15 language 'plpgsql';
При желании можно в одном запросе повернуть скаляр, доставшийся от какого-то другого куска кода, как вдоль так и поперёк. Что иногда приходится проделывать. Выглядит это примерно так:
113 SELECT col_to_arr(old_id_alias)
114 INTO new_id_array
115 FROM table1,table2,tableN, arr_to_col(old_id_arr) old_id_alias
116 WHERE table1.id=old_id_alias AND ...
Сначала old_id_arr представляется в виде столбца, связывается с несколькими таблицами условиями, полученная выборка преобразуется в массив для дальнейшей работы.
В общем, хозяйке на заметку.
Комментариев нет:
Отправить комментарий