So ermitteln Sie die Größe eines Arrays in postgresql

93

Gibt es eine Möglichkeit, die Größe eines Arrays zu ermitteln?

Beispielsweise,

CREATE TABLE example (id integer[]) ;

INSERT INTO exam VALUES ( '{}');

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

Gibt es daraus Möglichkeiten, ein Ergebnis wie das folgende zu erhalten:

size

0

3
aabi
quelle

Antworten:

112

Wie Vyegorov erwähnt, array_lengthwird der Trick tun. Oder wenn Sie wissen, dass das Array eindimensional ist (was wahrscheinlich ist) und PostgreSQL 9.4 oder höher ausführen, können Sie Folgendes verwenden cardinality:

SELECT cardinality(id) FROM example;
Adam Dingle
quelle
10
Wenn jemand den Hauptunterschied bei der Verwendung von Array_Länge und Kardinalität erwähnen kann, wäre das großartig
Zia Ul Rehman Mughal
6
cardinalityGibt die Anzahl aller Elemente in einem ein- oder mehrdimensionalen Array zurück. So select cardinality(ARRAY[[1,2], [3,4]]);würde zurückkehren 4, während select array_length(ARRAY[[1,2], [3,4]], 1)zurückkehren würde 2. Wenn Sie die erste Dimension zählen, array_lengthist dies eine sicherere Wette.
Roshambo
2
Dies funktioniert auch für ein Array, das in einem Feld mit textTyp gespeichert ist , während function array_length(text[]) does not exist;)
Santuxus
1
@ZiaUlRehmanMughal Die Array-Länge eines leeren Arrays wird unerwartet ausgewertet nullund nicht, 0während das cardinalityzurückgegeben wird, was Sie erwarten würden. Keine Ahnung, was sie mit dieser Logik dachten.
EoghanM
79

Es ist trivial , Dokumente zu lesen :

SELECT array_length(id, 1) FROM example;
vyegorov
quelle
12
Weißt du, was der zweite Parameter der Funktion ist array_length. Ich habe diese Informationen nicht in den Dokumenten gefunden.
Suzanshakya
19
@suzanshakya, die Länge der angeforderten Array- Dimension
vyegorov
4
Dies wird zurückgegeben nullund 3anstelle von 0und 3für das OP-Beispiel. Sollte auf jeden Fall die Verwendung fördern, cardinalitywenn eine Antwort akzeptiert wird, da sie einfacher zu verwenden und weniger unerwartet ist (ich stelle mir vor, dass 99,999% der Arrays eindimensional sind)
EoghanM
8

Angenommen, die Dimension des Arrays ist immer 1, ist nichts, mit dem ich mich wohl fühle, also habe ich Folgendes gewählt:

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

Es ist ... mindestens ein Jahrzehnt her, aber wir haben viel damit gemacht coalesceund es war ziemlich praktisch. Vielleicht greife ich aus Bequemlichkeit danach?

jc00ke
quelle
3

Musste array_upper in postgres 8.2 verwenden.

Sean Anderson
quelle
Lebensretter. Da fast alle Posts da draußen array_length () verwenden, vorausgesetzt, die Leute sind auf Postgres 9+; (
uniquegino