You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Postgres的array_position函数查询pg_catalog时为何疑似0索引?

问题原因

核心差异在于:PostgreSQL系统表(如pg_catalog.pg_index)中存储的indkey、indoption等数组字段是0基下标数组,和普通用户自定义的默认1基数组的索引规则不一样。

1. 为什么array_position返回0

array_position函数返回的是匹配元素所在的实际下标值,不是相对于数组首元素的偏移量。
pg_index.indkey作为系统内部维护的数组,默认下界是0,第一个元素的下标就是0,所以你查询索引第一列对应的ordinal_position时,array_position自然返回0,和普通1基数组返回1的行为不同,你手动+1得到1基计数的逻辑是正确的。

你可以执行下面的查询验证indkey的下标规则:

SELECT array_lower(indkey, 1) AS indkey_array_lower_bound FROM pg_catalog.pg_index LIMIT 1;

返回结果的indkey_array_lower_bound值为0,即可确认数组的起始下标。

2. 为什么返回的0可以直接作为indoption的下标正常取数

pg_index.indoption和indkey一样,都是系统内部存储的0基下标数组,下标0刚好对应索引第一列的选项值,和array_position返回的下标完全匹配,所以不需要做+1调整就能正常取到正确的排序规则。

普通用户自己创建的数组默认起始下标为1,所以你单独测试(array[4,5,6])[2]返回5的行为是符合预期的,这个1基规则只适用于非系统表的自定义数组。


内容的提问来源于stack exchange,提问作者Teejay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:06:01