sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL multidimensionale arrays

Postgres-array elementen zijn altijd basiselementen , d.w.z. scalair waarden. Sub-arrays zijn geen "elementen" in Postgres. Array-plakjes behouden de oorspronkelijke afmetingen.

Je kunt een basiselement extraheren , wat een waarde is van het gegevenstype scalaire elementen.
Of u kunt een matrixsegment extraheren , die het originele array-gegevenstype en ook de originele array-afmetingen behoudt.

Jouw idee om een ​​sub-array als "element" op te halen zou daarmee in strijd zijn en is gewoon niet geïmplementeerd.

De handleiding is misschien duidelijker in zijn uitleg. Maar we kunnen in ieder geval vinden:

Uw eerste voorbeeld probeert te verwijzen naar een basiselement dat niet wordt gevonden (je hebt twee array-indexen nodig in een 2D-array). Dus Postgres retourneert NULL.
Uw 3e voorbeeld wikkelt de resulterende NULL gewoon in een nieuwe array.

afvlakken een array slice (maak er een 1-D array van) kunt u unnest() en voer de resulterende set naar een nieuwe ARRAY constructeur . Ofwel in een gecorreleerde subquery of in een LATERAL join (vereist pagina 9.3+). Beide demonstreren:

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;

En zorg ervoor dat u de huidige versie van de handleiding leest . uw referenties verwijzen naar Postgres 9.1, maar de kans is groot dat u Postgres 9.4 daadwerkelijk gebruikt.

Gerelateerd:




  1. Hoe de functie POSITION() werkt in MySQL

  2. Hoe de kolommen voor de INNER JOIN-tabel te selecteren, afhankelijk van de waarden van de samengevoegde arrays

  3. Eenvoudige manier om kolommen en rijen in SQL te transponeren?

  4. MySQL:InnoDb:Semaphore-wachttijd heeft> 600 seconden geduurd. We laten de server opzettelijk crashen