规格化数组下标,使其从1开始 [英] Normalize array subscripts so they start with 1
本文介绍了规格化数组下标,使其从1开始的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
PostgreSQL可以使用array subscripts starting anywhere。
考虑以下示例,该示例创建一个具有3个下标从5到7的元素的数组:
SELECT '[5:7]={1,2,3}'::int[];
退货:
[5:7]={1,2,3}
我们在下标5
处获得第一个元素:
SELECT ('[5:7]={1,2,3}'::int[])[5];
我希望将一维数组规范化为从数组下标1开始。
我能想到的最好的办法:
SELECT ('[5:7]={1,2,3}'::int[])[array_lower('[5:7]={1,2,3}'::int[], 1):array_upper('[5:7]={1,2,3}'::int[], 1)]
相同,读起来更简单:
WITH cte(a) AS (SELECT '[5:7]={1,2,3}'::int[])
SELECT a[array_lower(a, 1):array_upper(a, 1)]
FROM cte;
您知道更简单/更快或至少更优雅的方法吗?
Postgres 9.5上旧解决方案的基准测试
db<;>;小提琴here
基准,包括Postgres 14上的新解决方案
db<;>;小提琴here
推荐答案
有一种更简单的方法很难看,但我相信它在技术上是正确的:从数组中提取尽可能大的片,而不是具有计算边界的精确片。 它避免了两个函数调用。
示例:
select ('[5:7]={1,2,3}'::int[])[-2147483648:2147483647];
结果为:
int4 --------- {1,2,3}
这篇关于规格化数组下标,使其从1开始的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文