sql >> Database >  >> RDS >> PostgreSQL

Hoe een 1d-array uit een 2d-array te selecteren?

Om het eerste plakje te krijgen van een array:

SELECT my_arr[1:1];

De resulterende array heeft de dezelfde arraydimensies als invoer.
Details in mijn vorige antwoord hier:

  • Matrix één niveau verwijderen

Om af te vlakken het resultaat:

SELECT ARRAY(SELECT unnest(my_arr[1:1]));

Of schoner:

SELECT ARRAY(SELECT * FROM unnest(my_arr)[1:1]));

Voorbeelden

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

Resultaat:

{{1,2,3}}  -- 2D array

Of:

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

Resultaat:

{1,2,3}  -- 1D array

Emuleer unnest() in Postgres 8.3

Reactie op je opmerking:
De Wiki-pagina waarnaar je linkt was een beetje misleidend. Ik heb het bijgewerkt met code voor 2-dimensionale arrays.

unnest() voor 1-dimensionale array:

CREATE OR REPLACE FUNCTION unnest_1d(anyarray)
  RETURNS SETOF anyelement AS
$func$
SELECT $1[i]
FROM   generate_series(array_lower($1,1), array_upper($1,1)) i
$func$  LANGUAGE sql IMMUTABLE;

unnest() voor 2-dimensionale array:

CREATE OR REPLACE FUNCTION unnest_2d(anyarray)
  RETURNS SETOF anyelement AS
$func$
SELECT $1[d1][d2]
FROM   generate_series(array_lower($1,1), array_upper($1,1)) d1
    ,  generate_series(array_lower($1,2), array_upper($1,2)) d2
$func$  LANGUAGE sql IMMUTABLE;

De aggregatiefunctie array_agg() is niet standaard geïnstalleerd in Postgres 8.3:

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

Unnest 2d-array naar 1d-array:

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

SQL Fiddle.




  1. 6 veelvoorkomende storingsscenario's voor MySQL en MariaDB en hoe u ze kunt oplossen

  2. Hoe SQL Server op een Mac te installeren

  3. Hoe de naam van een beperking in Oracle te vinden

  4. Verbind SQL Server met HubSpot CRM