Jak znaleźć rozmiar tablicy w postgresql

100

Czy istnieje sposób na znalezienie rozmiaru tablicy?

Na przykład,

CREATE TABLE example (id integer[]) ;

INSERT INTO exam VALUES ( '{}');

INSERT INTO exam VALUES ( '{5,6,7}');

Czy na tej podstawie można uzyskać taki wynik,

size

0

3
aabi
źródło

Odpowiedzi:

123

Jak wspomniał vyegorov, załatwi sprawę array_length. Lub jeśli wiesz, że tablica jest 1-wymiarowa (co jest prawdopodobne) i działa na PostgreSQL 9.4 lub nowszym, możesz użyć cardinality:

SELECT cardinality(id) FROM example;
Adam Dingle
źródło
10
Jeśli ktokolwiek może wspomnieć o dużej różnicy w używaniu długości_tablicy i liczności, to byłoby świetnie
Zia Ul Rehman Mughal
6
cardinalityzwraca liczbę wszystkich elementów w jednej lub wielowymiarowej tablicy. Więc select cardinality(ARRAY[[1,2], [3,4]]);wróci 4, podczas gdy select array_length(ARRAY[[1,2], [3,4]], 1)wróci 2. Jeśli liczysz pierwszy wymiar, array_lengthjest to bezpieczniejszy zakład.
Roshambo
2
Działa to również dla tablicy zapisanej w polu z texttypem, while function array_length(text[]) does not exist;)
santuxus
2
@ZiaUlRehmanMughal również długość tablicy pustej tablicy niespodziewanie ocenia się null, a nie 0podczas cardinalitypowrotów, czego można oczekiwać. Nie mam pojęcia, co myśleli, kierując się tą logiką.
EoghanM
82

To trywialne czytanie dokumentów :

SELECT array_length(id, 1) FROM example;
vyegorov
źródło
14
Czy wiesz, jaki jest drugi parametr funkcji array_length. Nie znalazłem tych informacji w dokumentach.
suzanshakya
19
@suzanshakya, długość żądanego wymiaru tablicyツ
vyegorov
5
Powróci nulli 3zamiast 0i 3dla przykładu PO. Zdecydowanie powinien promować używanie cardinalityprzy akceptowaniu odpowiedzi, ponieważ jest łatwiejszy w użyciu i mniej nieoczekiwany (wyobrażam sobie, że 99,999% tablic jest jednowymiarowych)
EoghanM
9

Zakładanie, że wymiar tablicy zawsze będzie wynosił 1, nie jest czymś, z czym czuję się komfortowo, więc zdecydowałem się na następujące:

SELECT coalesce(array_length(id, 1), 0) as size FROM example;

Minęło ... co najmniej dekadę, ale dużo z coalescetym robiliśmy i było to całkiem przydatne. Może sięgam po to z wygody?

jc00ke
źródło
3

Musiałem użyć array_upper w postgres 8.2.

Sean Anderson
źródło
Oszczędza życie. Jak prawie wszystkie posty używają array_length () zakładając, że ludzie są na postgres 9+; (
uniquegino