sql >> Database >  >> RDS >> PostgreSQL

Unnes array met één niveau

Uitleggen

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[0]

geeft hetzelfde terug als

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[17]

dat is NULL. Ik citeer de documenten hierover:

De indexwaarde van de ondergrens van de afmetingen van een array is standaard ingesteld op één.

0 heeft hier geen speciale betekenis. Ook heeft u bij tweedimensionale arrays twee indexen nodig om een ​​basiselement te krijgen. Zoals dit:

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1][2]

Resultaat:

2

Het eerste deel van je bericht is een beetje onduidelijk.

SELECT array_dims(ARRAY[[1,2,3], [4,5,6], [7,8,9]])

Resultaat:

[1:3][1:3]

Dat zijn twee afmetingen met elk 3 elementen (1 tot 3) (9 basiselementen).
Als u n-1 . wilt afmetingen dan is dit een correct resultaat:

SELECT ARRAY (SELECT unnest('{{1,2,3}, {4,5,6}, {7,8,9}}'::int[]))

Resultaat:

{1,2,3,4,5,6,7,8,9}

Dat is één dimensie. unnest() produceert altijd één basiselement per rij. Ik weet niet zeker welk resultaat u precies wenst. Uw voorbeeld is gewoon weer een 2-dimensionale array met een ontbrekende set accolades ... ?

{1,2,3}, {4,5,6}, {7,8,9}

Als u een deel van de array . wilt , probeer deze notatie:

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:2]

Resultaat:

{{1,2,3},{4,5,6}}

Of dit:

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[2:2][1:2]

Resultaat:

{{4,5}}

Om af te vlakken het resultaat (krijg een 1D-array):

  • Hoe 1d-array te selecteren uit 2d-array postgresql

Lees hier meer in de handleiding.

Functie

Een latere test onthulde dat deze plpgsql-functie veel . is sneller. Vereist Postgres 9.1 of hoger:

CREATE OR REPLACE FUNCTION unnest_2d_1d(ANYARRAY, OUT a ANYARRAY)
  RETURNS SETOF ANYARRAY AS
$func$
BEGIN
   FOREACH a SLICE 1 IN ARRAY $1 LOOP
      RETURN NEXT;
   END LOOP;
END
$func$  LANGUAGE plpgsql IMMUTABLE;

Zie:

  • Hoe een 2D-array snel in PostgreSQL te unnesten in een 1d-array?

Dit is een verbeterde en vereenvoudigde versie van de functie die Lukas plaatste:

CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
  RETURNS SETOF anyarray AS
$func$
SELECT array_agg($1[d1][d2])
FROM   generate_subscripts($1,1) d1
    ,  generate_subscripts($1,2) d2
GROUP  BY d1
ORDER  BY d1
$func$  LANGUAGE sql IMMUTABLE;

Voor Postgres-versies <8.4, array_agg() is niet standaard geïnstalleerd. Maak het eerst aan:

CREATE AGGREGATE array_agg(anyelement) (
 SFUNC=array_append,
 STYPE=anyarray,
 INITCOND='{}'
);

Ook generate_subscripts() is nog niet geboren. Gebruik in plaats daarvan:

...
FROM   generate_series(array_lower($1,1), array_upper($1,1)) d1
    ,  generate_series(array_lower($1,2), array_upper($1,2)) d2
...

Bel:

SELECT unnest_2d_1d(ARRAY[[1,2], [3,4], [5,6]]);

Resultaat

{1,2}
{3,4}
{5,6}

SQL Fiddle.



  1. MySQL High Availability Framework uitgelegd – Deel II:semisynchrone replicatie

  2. Onbekende kolom in 'veldlijst'-fout op MySQL Update-query

  3. Een gebruiker maken en machtigingen verlenen in Oracle

  4. SQL Server-systeemdatabases - Systeemdatabases herstellen