PostgreSQL可以使用从任何位置开始的数组下标。
考虑以下示例,创建一个包含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<>fiddle 这里
在Postgres 14上包括新解决方案的基准测试
db<>fiddle 这里
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))]
- Wellspring