PostgreSQL整数数组列统计:单值多值条目数查询报错解决
解决PostgreSQL 9.6中整数数组长度统计的报错问题
问题原因
你遇到的报错是因为实际执行时array_length函数缺少了第二个参数(指定数组维度)——虽然你提供的SQL代码里写了,1,但报错信息显示的调用是array_length(log_session),遗漏了维度参数。不过即使参数正确,也可以用更简洁的函数来实现统计。
正确的统计方法
方法1:修复array_length的调用
确保传入第二个参数(一维数组指定为1):
select count(*) filter(where array_length(log_session, 1) = 1) as cnt_length_1, count(*) filter(where array_length(log_session, 1) > 1) as cnt_length_more_than_1 from mytable;
方法2:使用更简洁的cardinality()函数
PostgreSQL 9.4及以上版本支持cardinality(),直接返回数组的总元素数,无需指定维度,更适合一维数组的统计:
select count(*) filter(where cardinality(log_session) = 1) as cnt_length_1, count(*) filter(where cardinality(log_session) > 1) as cnt_length_more_than_1 from mytable;
方法3:显式类型转换(可选)
如果怀疑数组类型存在隐式转换问题,可以显式转换为integer[]:
select count(*) filter(where cardinality(log_session::integer[]) = 1) as cnt_length_1, count(*) filter(where cardinality(log_session::integer[]) > 1) as cnt_length_more_than_1 from mytable;
说明
array_length(arr, n):返回数组第n维的长度,对于一维数组,n=1即可正确获取元素个数。cardinality(arr):直接返回数组的总元素数量,对于一维数组,效果和array_length(arr,1)完全一致,写法更简洁。
内容的提问来源于stack exchange,提问作者arilwan
相关产品推荐
相关产品推荐

