sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur väljer man 1d array från 2d array?

För att få den första skivan av en array:

SELECT my_arr[1:1];

Den resulterande arrayen har samma arraydimensioner som ingång.
Detaljer i mitt tidigare svar här:

  • Unnest array med en nivå

Att platta ut resultatet:

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

Eller renare:

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

Exempel

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

Resultat:

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

Eller:

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

Resultat:

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

Emulera unnest() i Postgres 8.3

Svar på din kommentar:
Wikisidan du länkar till var lite missvisande. Jag uppdaterade den med kod för 2-dimensionella arrayer.

unnest() för 1-dimensionell 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() för 2-dimensionell 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;

Den aggregerade funktionen array_agg() är inte installerat som standard i Postgres 8.3:

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

Ta bort 2d-arrayer till 1d-arrayer:

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. Vad är DBMS? – En omfattande guide till databashanteringssystem

  2. Java - hitta den första orsaken till ett undantag

  3. Hur ändrar man identitetskolumns värden programmatiskt?

  4. Hur upprepar jag ett resurs-id #6 från ett MySql-svar i PHP?