如何在PostgreSQL中查找数组的大小

166

有没有办法找到一个数组的大小?

例如:

CREATE TABLE example (id integer[]) ;

INSERT INTO example VALUES ( '{}');

INSERT INTO example VALUES ( '{5,6,7}');

从这个例子中,有没有可能得到以下结果:

size

0

3
4个回答

237
正如vyegorov提到的那样,array_length可以解决问题。或者,如果您知道数组是一维的(很可能),并且正在运行PostgreSQL 9.4或更高版本,则可以使用cardinality
SELECT cardinality(id) FROM example;

27
如果有人能够提到使用 array_length 和 cardinality 的主要区别,那就太好了。 - Zia Ul Rehman Mughal
23
cardinality 函数返回单个或多维数组中所有元素的数量。因此,select cardinality(ARRAY[[1,2], [3,4]]); 将返回 4,而 select array_length(ARRAY[[1,2], [3,4]], 1) 将返回 2。如果您想计算第一维度的长度,则使用 array_length 更为可靠。 - Roshambo
9
这也适用于保存在text类型字段中的数组,而function array_length(text[]) does not exist(意为“函数array_length(text[])不存在”);)。 - santuxus
4
@ZiaUlRehmanMughal,同时空数组的长度评估结果意外地是null而不是0,而cardinality返回你所期望的结果。不知道他们当时在想什么逻辑。 - EoghanM
2
我不知道为什么这被称为 cardinality... 我认为像 array_size 这样的名称更加直观 - Hiroki
显示剩余2条评论

114

阅读文档很容易

SELECT array_length(id, 1) FROM example;

26
你知道函数 array_length 的第二个参数是什么吗?我在文档中没有找到相关信息。 - suzanshakya
27
@suzanshakya,所请求数组_dimension_的长度为... - vyegorov
13
对于OP的示例,这将返回null3,而不是03。在接受答案时肯定应该推荐使用cardinality,因为它更易于使用且不会产生意外效果(我想99.999%的数组使用都是单维的)。 - EoghanM
https://dev59.com/c1sX5IYBdhLWcg3wALba - sunki

21

我不太舒服假设数组的尺寸总是为1,因此我选择了以下方式:

SELECT coalesce(array_length(id, 1), 0) as size FROM example;

过去至少十年了,但我们曾经经常使用 coalesce,它非常方便。也许我只是出于习惯而寻找它?


8

在PostgreSQL 8.2中,必须使用“array_upper”函数。


1
救命稻草。几乎所有的帖子都使用array_length(),假设人们正在使用PostgreSQL 9+ ;( - uniquegino

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