Как разделить тип на несколько столбцов в 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 час у меня нигде. Поэтому я надеюсь, что я добавлю некоторые ключевые слова поиска в конце: несколько возвращаемых значений несколько результатов несколько столбцов unnest list unnest set
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);
решение, которое я нашел, было использовать join:
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 (* + * = *, ++);
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