【发布时间】:2012-06-26 16:11:03
【问题描述】:
有什么方法可以求出数组的大小?
例如,
CREATE TABLE example (id integer[]) ;
INSERT INTO exam VALUES ( '{}');
INSERT INTO exam VALUES ( '{5,6,7}');
由此,有没有可能得到如下结果,
size
0
3
【问题讨论】:
标签: sql arrays postgresql size
有什么方法可以求出数组的大小?
例如,
CREATE TABLE example (id integer[]) ;
INSERT INTO exam VALUES ( '{}');
INSERT INTO exam VALUES ( '{5,6,7}');
由此,有没有可能得到如下结果,
size
0
3
【问题讨论】:
标签: sql arrays postgresql size
这是微不足道的reading docs:
SELECT array_length(id, 1) FROM example;
【讨论】:
array_length的第二个参数是什么吗?在文档中找不到该信息。
null 和 3,而不是 OP 示例中的 0 和 3。在接受答案时绝对应该提倡使用cardinality,因为它更容易使用且更少意外(我想 99.999% 的数组使用都是一维的)
正如vyegorov 提到的,array_length 可以解决问题。或者如果你知道数组是一维的(很可能)并且运行的是 PostgreSQL 9.4 或更高版本,你可以使用cardinality:
SELECT cardinality(id) FROM example;
【讨论】:
cardinality 返回单个或多维数组中所有元素的数量。所以select cardinality(ARRAY[[1,2], [3,4]]); 将返回4,而select array_length(ARRAY[[1,2], [3,4]], 1) 将返回2。如果您计算第一个维度,array_length 是更安全的选择。
text 类型字段中的数组,而 function array_length(text[]) does not exist ;)
null 而不是0 而cardinality 返回你所期望的。不知道他们用这种逻辑在想什么。
cardinality... 像 array_size 这样的东西会更直观 IMO
不得不在 postgres 8.2 中使用 array_upper。
【讨论】:
假设数组的维度总是 1 我觉得不舒服,所以我选择了以下内容:
SELECT coalesce(array_length(id, 1), 0) as size FROM example;
已经……至少有十年了,但我们过去经常使用 coalesce 做很多事情,而且非常方便。也许我是出于舒适而伸手去拿它?
【讨论】: