Como encontrar o tamanho de um array no postgresql

100

Existe alguma maneira de encontrar o tamanho de uma matriz?

Por exemplo,

CREATE TABLE example (id integer[]) ;

INSERT INTO exam VALUES ( '{}');

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

A partir disso, há alguma possibilidade de obter um resultado como seguir,

size

0

3
aabi
fonte

Respostas:

123

Como vyegorov mencionou, resolverá array_lengtho problema. Ou se você sabe que a matriz é unidimensional (o que é provável) e está executando o PostgreSQL 9.4 ou superior, você pode usar cardinality:

SELECT cardinality(id) FROM example;
Adam Dingle
fonte
10
Se alguém puder mencionar a principal diferença em usar array_length e cardinality, isso seria ótimo
Zia Ul Rehman Mughal
6
cardinalityretorna o número de todos os elementos em uma matriz única ou multidimensional. Então select cardinality(ARRAY[[1,2], [3,4]]);voltaria 4, enquanto select array_length(ARRAY[[1,2], [3,4]], 1)voltaria 2. Se você está contando a primeira dimensão, array_lengthé uma aposta mais segura.
Roshambo de
2
Isso também funciona para uma matriz salva em um campo com texttipo, enquanto function array_length(text[]) does not exist;)
santuxus
2
@ZiaUlRehmanMughal também o comprimento do array de um array vazio é avaliado inesperadamente como nulle não 0enquanto cardinalityretorna o que você esperaria. Não tenho ideia do que eles estavam pensando com essa lógica.
EoghanM
82

É trivial ler documentos :

SELECT array_length(id, 1) FROM example;
Vyegorov
fonte
14
Você sabe qual é o segundo parâmetro da função array_length. Não encontrei essa informação nos documentos.
suzanshakya
19
@suzanshakya, o comprimento da dimensão da matriz solicitadaツ
vyegorov
5
Isso retornará nulle em 3vez de 0e 3para o exemplo de OPs. Definitivamente, deve promover o uso de cardinalityao aceitar uma resposta, pois é mais fácil de usar e menos inesperado (imagino que 99,999% do uso de matrizes são unidimensionais)
EoghanM
9

Presumir que a dimensão da matriz sempre será 1 não é algo com que me sinta confortável, então optei pelo seguinte:

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

Já faz ... pelo menos uma década, mas costumávamos fazer muito com coalescee era muito útil. Talvez eu esteja tentando pegá-lo por conforto?

jc00ke
fonte
3

Tive que usar array_upper no postgres 8.2.

Sean Anderson
fonte
Saver de vida. Como quase todos os posts por aí estão usando array_length () assumindo que as pessoas estão no postgres 9+; (
uniquegino