Как разбить тип на несколько столбцов в Postgres?
У меня есть следующий код для возврата нескольких значений из pl/python:
CREATE TYPE named_value AS (
name text,
value integer
);
CREATE or replace FUNCTION make_pair (name text, value integer)
RETURNS named_value
AS $$
return [ name, value ]
$$ LANGUAGE plpythonu;
select make_pair('egg', 4) as column;
Выход:
column
(egg,4)
Я хочу разделить вывод на две отдельные колонки. Как это:
column, column2
egg, 4
Как мне это сделать? Погуглил за 1 час, я никуда не попал. Поэтому я надеюсь, что в конце я добавлю несколько ключевых слов для поиска: несколько возвращаемых значений, несколько результатов, несколько столбцов.
4 ответа
Да, синтаксис для этого немного странный, требующий дополнительных скобок:
select (make_pair('egg', 4)).name
Чтобы получить несколько компонентов из вывода, одновременно вызывая функцию один раз, вы можете использовать дополнительный выбор:
select (x.column).name, (x.column).value from (select make_pair('egg', 4) as column) x;
SELECT * FROM make_pair('egg', 4);
и несколько вариантов:
SELECT name, value FROM make_pair('egg', 4) AS x;
SELECT a, b FROM make_pair('egg', 4) AS x(a,b);
Решение, которое я нашел, состояло в том, чтобы использовать соединение:
create table tmp (a int, b int, c int);
insert into tmp (a,b,c) values (1,2,3), (3,4,5), (5,12,13);
create type ispyth3 as (is_it boolean, perimeter int);
create function check_it(int, int, int) returns ispyth3 as $$
begin
return ($1*$1 + $2*$2 = $3*$3, $1+$2+$3);
end
$$ language plpgsql;
select * from tmp join check_it(a,b,c) on 1=1;
Это возвращает:
a | b | c | is_it | perimeter
---+----+----+-------+-----------
1 | 2 | 3 | f | 6
3 | 4 | 5 | t | 12
5 | 12 | 13 | t | 30
(3 rows)
Ниже приведен рабочий код, позволяющий избежать необходимости дважды запускать функцию и одновременно избегать подзапроса.
CREATE TYPE named_value AS (
name text,
value integer
);
CREATE or replace FUNCTION setcustomvariable(variablename text, variablevalue named_value)
RETURNS named_value
AS $$
GD[variablename] = variablevalue
return variablevalue
$$ LANGUAGE plpythonu;
CREATE or replace FUNCTION getcustomvariable(variablename text)
RETURNS named_value
AS $$
return GD[variablename]
$$ LANGUAGE plpythonu;
CREATE or replace FUNCTION make_pair (name text, value integer)
RETURNS named_value
AS $$
return [ name, value ]
$$ LANGUAGE plpythonu;
select setcustomvariable('result', make_pair('egg', 4)), (getcustomvariable('result')).name, (getcustomvariable('result')).value