Postgres中如何对子查询拼接结果执行字符串聚合?
解决Postgres中字符串聚合子查询返回多行的问题
你的问题出在不必要的子查询嵌套上——外层查询每遍历一行表记录,就会执行一次内部的子查询,而这个子查询会返回该schema下的所有表(多行结果),这就导致了"子查询作为表达式返回多行"的错误。
其实完全不需要嵌套子查询,直接把拼接逻辑放到string_agg函数里,对符合条件的记录做一次聚合即可。
正确写法
方法1:使用CONCAT函数
SELECT string_agg(CONCAT(table_schema, '.', table_name), ' ') AS full_table_names FROM information_schema.tables WHERE table_schema = 'name_of_schema';
方法2:使用Postgres原生字符串连接符||(更常用)
SELECT string_agg(table_schema || '.' || table_name, ' ') AS full_table_names FROM information_schema.tables WHERE table_schema = 'name_of_schema';
为什么原来的代码会报错?
你原来的SQL结构是:外层查询从information_schema.tables取每一行,然后对每一行执行一次子查询(子查询又返回该schema下的所有表)。这就导致string_agg的参数变成了一个返回多行的子查询,Postgres无法处理这种情况——string_agg需要的是单值表达式,而非多行结果集。
而上面的正确写法,是直接筛选出目标schema下的所有表,然后对每一行的table_schema.table_name拼接结果做聚合,最终返回单个字符串,完全符合你的需求。
内容的提问来源于stack exchange,提问作者user3523583
相关产品推荐
相关产品推荐

