sql >> Database teknologi >  >> RDS >> PostgreSQL

Fjern array med ét niveau

Forklar

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

returnerer det samme som

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

som er NULL. Jeg citerer dokumenterne om den sag:

Som standard er den nedre indeksværdi for et arrays dimensioner sat til én.

0 har ingen speciel betydning her. Med et todimensionelt array har du også brug for to indekser for at få et basiselement. Sådan:

VÆLG (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1][2] 

Resultat:

2 

Den første del af din besked er lidt uklar.

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

Resultat:

[1:3][1:3] 

Det er to dimensioner med 3 elementer (1 til 3) hver (9 basiselementer).
Hvis du vil have n-1 dimensioner, så er dette et korrekt resultat:

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

Resultat:

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

Det er én dimension. unnest() producerer altid et basiselement pr. række. Jeg er ikke sikker på, hvilket resultat du ønsker præcist. Dit eksempel er bare endnu et 2-dimensionelt array med et manglende sæt krøllede parenteser ... ?

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

Hvis du vil have et udsnit af arrayet , prøv denne notation:

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

Resultat:

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

Eller denne:

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

Resultat:

{{4,5}} 

At udjævne resultatet (få et 1D-array):

  • Sådan vælger du 1d array fra 2d array postgresql

Læs mere i manualen her.

Funktion

Senere test viste, at denne plpgsql-funktion er meget hurtigere. Kræver Postgres 9.1 eller nyere:

OPRET ELLER ERSTAT FUNKTION unnest_2d_1d(ANYARRAY, OUT a ANYARRAY) RETURERER SÆT AF ANYARRAY AS$func$BEGIN FOREACH a SLICE 1 I ARRAY $1 LOOP RETURN NEXT; END LOOP;END$func$ LANGUAGE plpgsql IMMUTABLE; 

Se:

  • Hvordan løsnes et 2d-array til et 1d-array hurtigt i PostgreSQL?

Dette er en forbedret og forenklet version af funktionen Lukas postede:

OPRET ELLER ERSTAT FUNKTION unnest_2d_1d(anyarray) RETURERER SÆT AF anyarray AS$func$SELECT array_agg($1[d1][d2])FRA gener_subscripts($1,1) d1 , gener_subscripts($1,2) d1ORGROUP BY AF d1$func$ LANGUAGE sql IMUTABLE; 

For Postgres-versioner <8.4, array_agg() er ikke installeret som standard. Opret det først:

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

Også generate_subscripts() er ikke født endnu. Brug i stedet:

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

Ring til:

VÆLG unnest_2d_1d(ARRAY[[1,2], [3,4], [5,6]]); 

Resultat

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

SQL Fiddle.



  1. Oracle getConnection langsom

  2. Sådan implementeres MariaDB Cluster 10.5 for høj tilgængelighed

  3. Hvordan kan jeg oprette en bruger i SQL Server Express-databasen, jeg føjede til mit projekt?

  4. Escape streng Python til MySQL