Postgres array element är alltid baselement , det vill säga skalär värden. Sub-arrays är inte "element" i Postgres. Arrayskivor behåller ursprungliga dimensioner.
Du kan antingen extrahera ett baselement , som är ett värde för den skalära elementdatatypen.
Eller så kan du extrahera en matrisdel , som behåller den ursprungliga arraydatatypen och även ursprungliga arraydimensioner.
Din idé att hämta en sub-array som "element" skulle komma i konflikt med det och är helt enkelt inte implementerad.
Manualen kan vara tydligare i sin förklaring. Men vi kan åtminstone hitta:
Ditt första exempel försöker referera till ett baselement som inte hittas (du skulle behöva två arrayindex i en 2D-array). Så Postgres returnerar NULL.
Ditt tredje exempel lindar bara den resulterande NULL i en ny array.
Att platta ut ett arraysegment (gör det till en 1D-array) kan du unnest()
och mata den resulterande uppsättningen till en ny ARRAY
konstruktör
. Antingen i en korrelerad underfråga eller i en LATERAL
gå med (kräver sid 9.3+). Visar båda:
SELECT s.col[2:2][2:3] AS slice_arr
, x.lateral_arr
, ARRAY(SELECT unnest(s.col[2:2][2:3])) AS corr_arr
FROM (SELECT ARRAY[[1,2,3],[4,5,6]] AS col) s
, LATERAL (SELECT ARRAY(SELECT * FROM unnest(s.col[2:2][2:3])) AS lateral_arr) x;
Och se till att läsa den aktuella versionen av manualen . dina referenser pekar på Postgres 9.1, men chansen är stor att du faktiskt använder Postgres 9.4.
Relaterat: