PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak wybrać tablicę 1d z tablicy 2d?

Aby uzyskać pierwszy kawałek tablicy:

SELECT my_arr[1:1];

Wynikowa tablica ma te same wymiary tablicy jako dane wejściowe.
Szczegóły w mojej poprzedniej odpowiedzi tutaj:

  • Rozpakuj tablicę o jeden poziom

Aby spłaszczyć wynik:

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

Lub czystszy:

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

Przykłady

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

Wynik:

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

Lub:

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

Wynik:

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

Emuluj unnest() w Postgresie 8.3

Odpowiedź na Twój komentarz:
Strona Wiki, do której linkujesz, była nieco myląca. Zaktualizowałem go kodem dla tablic dwuwymiarowych.

unnest() dla tablicy jednowymiarowej:

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() dla tablicy dwuwymiarowej:

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;

Funkcja agregująca array_agg() nie jest domyślnie instalowany w Postgres 8.3:

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

Rozpakuj tablicę 2d do tablic 1d:

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;

Skrzypce SQL.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Odejmij godziny od funkcji now()

  2. Jak się dowiedzieć, która partycja będzie używana w partycjonowaniu mieszającym Postgresa?

  3. PostgreSQL, przeciągnij i zamień

  4. Znajdź obiekty zależne dla tabeli lub widoku

  5. Deklarowanie struktury krotki rekordu w PL/pgSQL