sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL flerdimensionella arrayer

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:




  1. Behöver en insättningstrigger ett commit-uttalande

  2. Hur kör man PostgreSQL som en tjänst i Windows?

  3. mysql nyckelordssökning

  4. Hur man beräknar ändringar i Oracle sql