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
相关产品推荐
相关产品推荐

