PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie wähle ich ein 1D-Array aus einem 2D-Array aus?

Um das erste Slice zu erhalten eines Arrays:

SELECT my_arr[1:1];

Das resultierende Array hat dieselben Array-Dimensionen als Eingabe.
Details in meiner vorherigen Antwort hier:

  • Array um eine Ebene entschachteln

Zum Abflachen das Ergebnis:

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

Oder sauberer:

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

Beispiele

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

Ergebnis:

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

Oder:

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

Ergebnis:

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

emulieren Sie unnest() in Postgres 8.3

Antwort auf Ihren Kommentar:
Die Wiki-Seite, auf die Sie verlinken, war etwas irreführend. Ich habe es mit Code für zweidimensionale Arrays aktualisiert.

unnest() für eindimensionales 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 zweidimensionales 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;

Die Aggregatfunktion array_agg() wird in Postgres 8.3 nicht standardmäßig installiert:

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

2d-Array in 1d-Arrays entschachteln:

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-Geige.