postgresql 将select查询的输出存储在postgres的一个数组中

dohp0rv5  于 2023-04-05  发布在  PostgreSQL
关注(0)|答案(6)|浏览(227)

我的代码是:

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

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

DECLARE colnames text[]

如何将select的输出存储在colnames数组中。
是否需要初始化列名?

nvbavucw

nvbavucw1#

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

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'
);
5tmbdcev

5tmbdcev2#

我遇到了完全相同的问题。只是对Denis给出的解决方案进行了一次修改(必须指定类型):

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

xyhw6mcr3#

常规:

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

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

使用ARRAY_AGG

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

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

ttvkxqim4#

转换为数据类型“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;
mjqavswn

mjqavswn5#

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;

检查该列是否存在。要点:if exists(select _colname = any(colnames))我们也可以使用string_aggString_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;
avkwfej4

avkwfej46#

在函数中声明colnames text[]数组,然后在开始中编写以下查询:
SELECT column_name转换为列名FROM信息.SCHEMA.columns WHERE表名= 'aean'

相关问题