将array_agg输出转换为数组而不是字符串

6
我正在使用array_agg将值分组成一个数组。行的输出如下:
row: anonymous { values: '{(1),(2)}' }

我正在尝试在Node中循环遍历结果,

row.values.forEach(...但它说values.forEach不是一个函数,因为typeof row.values是字符串。

我正在使用array_agg,那么为什么输出是字符串,我应该如何将其转换为数组?


1
Postgres的wire协议将几乎所有内容表示为可打印字符串;由客户端驱动程序将其转换为本机数据类型(int、float、boolean等)。数组相对较少,因此大多数驱动程序没有内置处理它们的功能。不幸的是,字符串格式相当难以解析;一种解决方法是使用array_to_json来获取更容易解析的内容。(不回答,因为我不知道具体的驱动程序。) - IMSoP
3个回答

8

我也遇到了这个问题,但由于需要返回固定数量的行,并且无法保证我的内容不包含逗号或括号,从而使正则表达式解决方案具有挑战性,因此取消嵌套(unnest)不是一个选项。

我发现最好的解决方案是使用json_agg而不是array_agg。(请参阅文档) 这将以JSON格式返回结果,并将节点自动解释为javascript对象,因此您可以使用.forEach而无需任何转换。


1
使用 unnest 可以将一个数组转换为一组行。
create temp table t (name text);
insert into t values ('name1'),('name2'),('name3'),('name4');

select unnest(array_agg(name)) as aname from t

+-------+
| aname |
+-------+
| name1 |
+-------+
| name2 |
+-------+
| name3 |
+-------+
| name4 |
+-------+

0
如果你期望数组中包含整数,可以使用正则表达式并循环遍历(\d+)的匹配项。另一种方法是使用array_to_string函数,并使用不出现在内容中的值进行连接,例如换行符\narray_to_string(some_array_content, E'\n'),然后稍后再拆分它。一旦你以某种方式将其转换为数组,forEach将起作用。此外,我认为Sequelize可以处理数组:http://docs.sequelizejs.com/en/v3/api/datatypes/#array

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接