Amazon redshift redshift-如何将listagg与schema.columns表中的信息一起使用
我正在使用红移,希望创建一个以逗号分隔的列列表。我试图使用Amazon redshift redshift-如何将listagg与schema.columns表中的信息一起使用,amazon-redshift,string-aggregation,listagg,Amazon Redshift,String Aggregation,Listagg,我正在使用红移,希望创建一个以逗号分隔的列列表。我试图使用listag从信息模式中获取列名: SELECT listagg(column_name,',') within group (order by ordinal_position) FROM information_schema.columns WHERE table_schema = 'my_schema' AND table_name = 'my table'; 我得到以下错误: [Amazon](50031
listag
从信息模式中获取列名:
SELECT
listagg(column_name,',') within group (order by ordinal_position)
FROM information_schema.columns
WHERE table_schema = 'my_schema'
AND table_name = 'my table';
我得到以下错误:
[Amazon](500310) Invalid operation: Function (listagg(text,text)) must be applied on at least one user created tables;
虽然这并不能回答如何在信息模式上应用Listag,但我可以推荐一种替代方法,在pg目录表上使用Listag 试试这个:
SELECT DISTINCT listagg(attname, ',') WITHIN GROUP (ORDER BY a.attsortkeyord) AS "columns"
FROM pg_attribute a, pg_namespace ns, pg_class c, pg_type t, stv_tbl_perm p, pg_database db
WHERE t.oid=a.atttypid AND a.attrelid=p.id AND ns.oid = c.relnamespace AND db.oid = p.db_id AND c.oid = a.attrelid
AND typname NOT IN ('oid','xid','tid','cid')
AND ns.nspname = 'my_schema'
AND RTRIM(name) = 'my table'
这是我测试过的一个工作环境
select listagg(column_name, ', ') within group (order by column_name)
from
(
select
a.attname::varchar as column_name, typname::varchar as data_type
from
pg_type t,
pg_attribute a,
pg_class c,
pg_namespace ns,
(select top 1 1 from my_schema.my_table)
where
t.oid=a.atttypid
and a.attrelid = c.oid
and c.relnamespace = ns.oid
and typname NOT IN ('oid','xid','tid','cid')
and attname not in ('deletexid', 'insertxid')
and trim(relname) = 'my_table'
and ns.nspname = 'my_schema'
)
“名称”列属于哪个表?我怀疑这个解决办法是否有效@你能解决这个问题吗?