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<>在这里摆弄
基准包括 Postgres 14 上的新解决方案
db<>在这里摆弄