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

Zrušte vnoření pole o jednu úroveň

Vysvětlete

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

vrátí totéž jako

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

což je NULL. Cituji dokumenty k této záležitosti:

Ve výchozím nastavení je dolní mezní hodnota indexu rozměrů pole nastavena na jedna.

0 zde nemá žádný zvláštní význam. Také u dvourozměrných polí potřebujete dva indexy získat základní prvek. Takhle:

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

Výsledek:

2

První část vaší zprávy je trochu nejasná.

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

Výsledek:

[1:3][1:3]

To jsou dva rozměry se 3 prvky (1 až 3), každý (9 základních prvků).
Pokud chcete n-1 rozměry, pak je to správný výsledek:

SELECT ARRAY (SELECT unnest('{{1,2,3}, {4,5,6}, {7,8,9}}'::int[]))

Výsledek:

{1,2,3,4,5,6,7,8,9}

To je jedna dimenze. unnest() vždy vytvoří jeden základní prvek na řádek. Nejsem si jistý, jaký výsledek přesně si přejete. Váš příklad je jen další 2-rozměrné pole s chybějící sadou složených závorek ... ?

{1,2,3}, {4,5,6}, {7,8,9}

Pokud chcete část pole , zkuste tento zápis:

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

Výsledek:

{{1,2,3},{4,5,6}}

Nebo toto:

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

Výsledek:

{{4,5}}

Chcete-li vyrovnat výsledek (získáte 1D pole):

  • Jak vybrat 1d pole z 2d pole postgresql

Přečtěte si více v příručce zde.

Funkce

Pozdější test odhalil, že tato funkce plpgsql je hodně rychlejší. Vyžaduje Postgres 9.1 nebo novější:

CREATE OR REPLACE FUNCTION unnest_2d_1d(ANYARRAY, OUT a ANYARRAY)
  RETURNS SETOF ANYARRAY AS
$func$
BEGIN
   FOREACH a SLICE 1 IN ARRAY $1 LOOP
      RETURN NEXT;
   END LOOP;
END
$func$  LANGUAGE plpgsql IMMUTABLE;

Viz:

  • Jak rychle zrušit vnoření 2D pole do 1D pole v PostgreSQL?

Toto je vylepšená a zjednodušená verze funkce, kterou Lukas zveřejnil:

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

Pro Postgres verze <8.4, array_agg() není standardně nainstalován. Nejprve jej vytvořte:

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

Také generate_subscripts() se ještě nenarodil. Místo toho použijte:

...
FROM   generate_series(array_lower($1,1), array_upper($1,1)) d1
    ,  generate_series(array_lower($1,2), array_upper($1,2)) d2
...

Volejte:

SELECT unnest_2d_1d(ARRAY[[1,2], [3,4], [5,6]]);

Výsledek

{1,2}
{3,4}
{5,6}

SQL Fiddle.



  1. Docker:Kombinace více obrázků

  2. Co vrátí úspěšný MySQL DELETE? Jak zkontrolovat, zda bylo DELETE úspěšné?

  3. Úvod do databází časových řad

  4. Jak napíšete dotaz bez rozlišení velkých a malých písmen pro MySQL i Postgres?