规格化数组下标,使其从1开始 [英] Normalize array subscripts so they start with 1

查看:24
本文介绍了规格化数组下标,使其从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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆