PostgreSQL可以從任何地方開始使用數(shù)組下標??紤]以下示例,該示例創(chuàng)建一個包含3個元素的數(shù)組,下標從5到7:SELECT ('[5:7]={1,2,3}'::int[]);返回值:[5:7]={1,2,3}例如,這意味著您獲得了第一個元素SELECT ('[5:7]={1,2,3}'::int[])[5];我想規(guī)范化 任何給定的一維數(shù)組,以數(shù)組下標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 x(a) AS ( SELECT '[5:7]={1,2,3}'::int[] )SELECT a[array_lower(a, 1):array_upper(a, 1)]FROM x您知道更簡單/更快或更優(yōu)雅的方式嗎?基準測試為了測試性能,我提出了這個快速基準測試。具有100k行的表,隨機長度在1到11之間的簡單整數(shù)數(shù)組:CREATE TEMP TABLE t (a int[]);INSERT INTO t -- now with actually varying subscriptsSELECT ('[' || g%10 || ':' || 2*(g%10) || ']={1' || repeat(','||g::text, g%10) || '}')::int[]FROM generate_series(1,100000) g;EXPLAIN ANALYZESELECT substring(a::text, '{.*$')::int[] -- Total runtime: 949.304 ms-- a[-2147483648:2147483647] -- Total runtime: 283.877 ms-- a[array_lower(a, 1):array_upper(a, 1)] -- Total runtime: 311.545 msFROM t因此,是的,@ Daniel的想法稍快一些。@Kevin的文本轉換也可以,但是不會獲得很多積分。還有其他想法嗎?
3 回答

青春有我
TA貢獻1784條經(jīng)驗 獲得超8個贊
有一個更簡單的方法很丑陋,但我認為從技術上講是正確的:從數(shù)組中提取最大可能的切片,而不是具有計算范圍的確切切片。它避免了兩個函數(shù)調(diào)用。
例:
select ('[5:7]={1,2,3}'::int[])[-2147483648:2147483647];
結果是:
int4
---------
{1,2,3}

牛魔王的故事
TA貢獻1830條經(jīng)驗 獲得超3個贊
不知道這是否已經(jīng)涵蓋,但是:
SELECT array_agg(v) FROM unnest('[5:7]={1,2,3}'::int[]) AS a(v);
為了測試性能,我必須id在測試表上添加一列。慢。

一只萌萌小番薯
TA貢獻1795條經(jīng)驗 獲得超7個贊
最終,Postgres 9.6 彈出了一些更優(yōu)雅的東西。手冊:
可以省略lower-bound和/或upper-bound切片說明符;缺少的邊界將替換為數(shù)組下標的下限或上限。例如:
所以現(xiàn)在很簡單:
SELECT ('[5:7]={1,2,3}'::int[])[:];
與Daniel的硬編碼max數(shù)組下標解決方案具有相同的性能-這仍然是Postgres 9.5或更早版本的方法。
添加回答
舉報
0/150
提交
取消