如何在不将列保存到数据库的情况下在 postgres 函数中添加列?

How to add column inside postgres function without saving it to the db?

我有一个 postgres 数据库,我想创建一个函数,该函数 returns 我的 table 的副本,如果它的 id 在数组中,则新列的值为 1( idds[]) 函数作为输入获取。 在下面的代码中,我尝试创建一个临时 table(chosen) 如果它在 idds 数组中则具有 id 并手动添加显然不起作用的 isChosen 列...

CREATE OR REPLACE FUNCTION public.getTableFromArray(idds integer[])
    RETURNS table(
id INTEGER,
isChosen INTEGER
)
    LANGUAGE 'plpgsql'
    
AS $BODY$


begin
with chosen AS(SELECT id,isChosen=1 FROM table1 WHERE ARRAY[table1.id] <@ idds)
return query
SELECT id FROM table1 LEFT JOIN chosen ON table1.id=chosen.id;

end;
$BODY$;

您可以改用此查询:

select * , case when ARRAY[table1.id] <@ idds then 1 else 0 end as choosen FROM table1;

所以:

CREATE OR REPLACE FUNCTION public.getTableFromArray(idds integer[])
    RETURNS table(
id INTEGER,
isChosen INTEGER
)
    LANGUAGE 'plpgsql'    
AS $BODY$
begin
return query
select id , case when ARRAY[table1.id] <@ idds then 1 else 0 end as isChosen FROM table1;
end;
$BODY$;

或者,噪音小得多,一个适当的 boolean 输出列,并且在一个普通的 SQL 函数中没有无用的 CaMeL 案例标识符:

CREATE OR REPLACE FUNCTION public.get_table_from_array(idds integer[])
  RETURNS TABLE(id int, is_chosen bool)
  LANGUAGE sql AS
'SELECT t.id, t.id = ANY(idds) FROM table1 t';

也可以直接 运行 SQL 命令,不过:

SELECT id, id = ANY('{1,2,3}'::int[]) AS is_chosen FROM table1;