PostgreSQL存储过程中获取jsonb[]数组长度报错求助
解决PostgreSQL中jsonb[]数组无法用jsonb_array_length获取长度的问题
问题根源
你搞混了两种完全不同的"数组"类型:
jsonb[]是PostgreSQL的原生数组类型,本质是把多个独立的jsonb对象打包成PostgreSQL数组存储;jsonb_array_length()函数是专门用来计算JSON格式数组(也就是单个jsonb值,结构是[{"key":val}, ...]这种)的元素数量,它不认识PostgreSQL原生的jsonb[]类型,所以才会抛出"function jsonb_array_length(jsonb[]) does not exist"的错误。
正确解决方法
针对你的jsonb[]类型数组,用PostgreSQL原生的数组长度函数就能解决:
方法1:使用cardinality()函数(推荐,更简洁)
这个函数可以直接返回任意维度PostgreSQL数组的元素总数,一维数组的话就是元素个数:
SELECT cardinality(flexibleWorkouts) AS workout_count FROM your_table_name;
方法2:使用array_length()函数
需要指定数组的维度(一维数组传1即可):
SELECT array_length(flexibleWorkouts, 1) AS workout_count FROM your_table_name;
额外建议:如果应该用JSON数组而非原生数组
如果你的业务场景其实需要的是单个JSON格式的数组(比如要对数组内的JSON元素做更多JSON操作),那可以把现有的jsonb[]转换成jsonb类型的数组:
- 先更新数据,把原生数组转成JSON数组:
UPDATE your_table_name SET flexibleWorkouts = array_to_json(flexibleWorkouts)::jsonb;
- 修改字段类型为
jsonb:
ALTER TABLE your_table_name ALTER COLUMN flexibleWorkouts TYPE jsonb;
之后就可以正常使用jsonb_array_length()了:
SELECT jsonb_array_length(flexibleWorkouts) AS workout_count FROM your_table_name;
内容的提问来源于stack exchange,提问作者Vishnu Jayan
相关产品推荐
相关产品推荐

