15 января 2008

И вдоль и поперёк

Ещё когда только пришёл в проект, в котором предполагалось много и занудно писать на 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 представляется в виде столбца, связывается с несколькими таблицами условиями, полученная выборка преобразуется в массив для дальнейшей работы.
В общем, хозяйке на заметку.

Комментариев нет: