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

Rozpakuj tablicę o jeden poziom

Wyjaśnij

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

zwraca to samo co

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

co jest NULL. Cytuję dokumenty w tej sprawie:

Domyślnie dolna granica wartości indeksu wymiarów tablicy jest ustawiona na jeden.

0 nie ma tu żadnego specjalnego znaczenia. Ponadto, w przypadku tablic dwuwymiarowych, potrzebujesz dwóch indeksów aby uzyskać element bazowy. Tak:

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

Wynik:

2

Pierwsza część Twojej wiadomości jest nieco niejasna.

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

Wynik:

[1:3][1:3]

To dwa wymiary z 3 elementami (1 do 3) każdy (9 elementów podstawowych).
Jeśli chcesz n-1 wymiary to jest to poprawny wynik:

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

Wynik:

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

To jeden wymiar. unnest() zawsze wytwarza jeden element bazowy w rzędzie. Nie jestem pewien , jakiego dokładnie rezultatu oczekujesz . Twój przykład to tylko kolejna dwuwymiarowa tablica z brakującym zestawem nawiasów klamrowych... ?

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

Jeśli chcesz wycinek tablicy , wypróbuj ten zapis:

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

Wynik:

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

Albo to:

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

Wynik:

{{4,5}}

Aby spłaszczyć wynik (uzyskaj tablicę 1D):

  • Jak wybrać tablicę 1d z tablicy 2d postgresql

Przeczytaj więcej w instrukcji tutaj.

Funkcja

Późniejszy test wykazał, że ta funkcja plpgsql to dużo szybciej. Wymaga Postgresa 9.1 lub nowszego:

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;

Zobacz:

  • Jak szybko rozpakować tablicę 2d w tablicę 1d w PostgreSQL?

To jest ulepszona i uproszczona wersja funkcji opublikowanej przez Lukasa:

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;

Dla wersji Postgresa <8.4, array_agg() nie jest instalowany domyślnie. Utwórz najpierw:

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

Ponadto generate_subscripts() jeszcze się nie urodził. Użyj zamiast:

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

Zadzwoń:

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

Wynik

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

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. Jak tworzyć i usuwać bazy danych i tabele w PostgreSQL

  2. Konfigurowanie Django i PostgreSQL na dwóch różnych instancjach EC2

  3. Raport trendów PostgreSQL 2019:chmura prywatna i publiczna, migracje, kombinacje baz danych i najważniejsze powody

  4. Jak zadeklarować zmienną w PostgreSQL

  5. Jak napisać DataFrame do tabeli postgres?