sql >> Databáze >  >> RDS >> PostgreSQL

Jak vybrat 1d pole z 2d pole?

Chcete-li získat první výsek pole:

SELECT my_arr[1:1];

Výsledné pole má stejné rozměry pole jako vstup.
Podrobnosti v mé předchozí odpovědi zde:

  • Uvolnit pole o jednu úroveň

Chcete-li vyrovnat výsledek:

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

Nebo čistič:

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

Příklady

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

Výsledek:

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

Nebo:

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

Výsledek:

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

Emulace unnest() v Postgres 8.3

Odpověď na váš komentář:
Stránka Wiki, na kterou odkazujete, byla trochu zavádějící. Aktualizoval jsem jej kódem pro 2-rozměrná pole.

unnest() pro jednorozměrné pole:

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() pro 2-rozměrné pole:

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;

Agregační funkce array_agg() není ve výchozím nastavení nainstalován v Postgres 8.3:

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

Zrušit vnoření 2d pole do 1d pole:

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. Jak pivotovat neznámý počet sloupců a žádný agregát na SQL Server?

  2. Musím v Oracle vytvářet indexy cizích klíčů?

  3. Jak používat analytické funkce v oracle (přes rozdělení podle klíčového slova)

  4. Optimistické vs. pesimistické zamykání