将选择查询的输出存储在 postgres 中的一个数组中

我的代码是:

SELECT column_name
FROM information.SCHEMA.columns
WHERE table_name = 'aean'

它返回表 aean的列名。
现在我已经声明了一个数组:

DECLARE colnames text[]

如何将 select 的输出存储在 colnamesarray 中。
是否需要初始化域名?

170575 次浏览

有两种方法,一种是聚合:

SELECT array_agg(column_name::TEXT)
FROM information.schema.columns
WHERE table_name = 'aean'

另一种方法是使用数组构造函数:

SELECT ARRAY(
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'aean'
)

我假设这是用于 plpgsql 的,在这种情况下,您可以这样分配它:

colnames := ARRAY(
SELECT column_name
FROM information_schema.columns
WHERE table_name='aean'
);

我也有同样的问题。只是丹尼斯给出的解决方案的一个工作修改(必须指定类型) :

SELECT ARRAY(
SELECT column_name::text
FROM information_schema.columns
WHERE table_name='aean'
)

转换为数据类型“ TEXT”将确保您的查询可以毫无问题地运行。 在 plpgsql 中,当我们为数组变量赋值时,不需要使用类型强制转换。我的要求是获取一个特定表的所有列名的 CSV。我在 plpgsql 中使用了以下代码。

Declare col_list varchar[]:=NULL;
cols varchar:=NULL;
Begin
col_list := ARRAY(select t.name from frm_columns t where t.tname='emp_mstr');
cols := array_to_string(col_list,',');
return cols;
End;
CREATE OR REPLACE FUNCTION f_test_array(in _colname text)
returns text as $body$
DECLARE colnames text[];
begin
colnames := ARRAY(
SELECT column_name FROM information_schema.columns WHERE table_name='customer'
);
if exists(select _colname = any(colnames))
then return format('%s it exits.', _colname);
else return format('%s not exits.', _colname);
end if;
end
$body$
LANGUAGE plpgsql;

检查该列是否存在。 Key point: if exists(select _colname = any(colnames)) 我们也可以使用 string_agg 字符串 _ agg 用法:

CREATE OR REPLACE FUNCTION f_test_array1(in _colname text)
returns text as $body$
DECLARE colnames text;
begin
colnames := (SELECT string_agg(column_name,',') FROM information_schema.columns WHERE table_name='customer')::text;
if exists(select colnames ilike '%' || quote_literal(_colname) ||'%')
then return format('column %s  exits.', _colname);
else return format('column %s does not exits.', _colname);
end if;
end
$body$
LANGUAGE plpgsql;

Regular:

SELECT post_id FROM posts WHERE(poster_name='John');


output: [
{'post_id': 1},
{'post_id': 2},
{'post_id': 3},
]

Using ARRAY_AGG:

SELECT ARRAY_AGG(post_id) FROM posts WHERE(poster_name='John');


output: [
{[1, 2, 3]}
]