如何在不将列保存到数据库的情况下在 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;
我有一个 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;