тестовые объекты:
create table t ( sun numeric,
mon numeric,
tue numeric,
wed numeric,
thu numeric,
fri numeric );
insert into t(sun, mon, tue, wed, thu, fri)
values(1.24, 1.11, 4.51, 3.21, 2.21, 1.01);
альтернатива ответу @ Unreason без union
:
select day[i], amount[i]
from ( select generate_series(1,6) as i,
array['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri'] as day,
array[sun, mon, tue, wed, thu, fri] as amount
from t ) z;
если вам нужно быть более общим, вы можете сделать что-то вроде этого:1008 *
create or replace function unpivot(t) returns setof record
language plpgsql immutable strict as $$
declare
q record;
r record;
begin
for q in ( select attname, attnum
from pg_attribute
where attnum>0 and attrelid = ( select oid
from pg_class
where relname = 't' ) ) loop
for r in execute 'select '''||q.attname||'''::text, '||
'('||$1::text||'::t).'||q.attname||'::numeric' loop
return next r;
end loop;
end loop;
return;
end;$$;
select *
from unpivot((select row(t.*)::t from t))
as foo(day text, amount numeric);
Вы можете быть немного аккуратнее в 8.4 с предложением using
в execute
, но я не могу проверить это, поскольку я на 8.3