Cómo encontrar el tamaño de una matriz en postgresql

98

¿Hay alguna forma de encontrar el tamaño de una matriz?

Por ejemplo,

CREATE TABLE example (id integer[]) ;

INSERT INTO exam VALUES ( '{}');

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

A partir de esto, ¿hay alguna posibilidad de obtener un resultado como el siguiente,

size

0

3
aabi
fuente

Respuestas:

120

Como mencionó vyegorov, funcionará array_length. O si sabe que la matriz es unidimensional (lo cual es probable) y está ejecutando PostgreSQL 9.4 o superior, puede usar cardinality:

SELECT cardinality(id) FROM example;
Adam Dingle
fuente
10
Si alguien puede mencionar la principal diferencia en el uso de array_length y cardinality, sería genial
Zia Ul Rehman Mughal
6
cardinalitydevuelve el número de todos los elementos de una matriz única o multidimensional. Entonces select cardinality(ARRAY[[1,2], [3,4]]);volvería 4, mientras select array_length(ARRAY[[1,2], [3,4]], 1)que volvería 2. Si está contando la primera dimensión, array_lengthes una apuesta más segura.
Roshambo
2
Esto también funciona para una matriz guardada en un campo con texttipo, mientras function array_length(text[]) does not exist;)
santuxus
1
@ZiaUlRehmanMughal también la longitud de la matriz de una matriz vacía se evalúa inesperadamente nully no 0mientras cardinalitydevuelve lo que esperaría. No tengo idea de lo que estaban pensando con esa lógica.
EoghanM
82

Son documentos de lectura triviales :

SELECT array_length(id, 1) FROM example;
Vyegorov
fuente
13
¿Sabes cuál es el segundo parámetro de la función array_length? No encontré esa información en los documentos.
suzanshakya
19
@suzanshakya, la longitud de la dimensión de matriz solicitadaツ
vyegorov
5
Esto volverá nully en 3lugar de 0y 3para el ejemplo de OP. Definitivamente debería promover el uso de cardinalityal aceptar una respuesta, ya que es más fácil de usar y menos inesperado (imagino que el uso del 99,999% de las matrices es unidimensional)
EoghanM
9

Asumir que la dimensión de la matriz siempre será 1 no es algo con lo que me sienta cómodo, así que elegí lo siguiente:

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

Ha pasado ... al menos una década, pero solíamos hacer mucho con coalesceél y fue bastante útil. ¿Quizás lo estoy buscando por comodidad?

jc00ke
fuente
3

Tuve que usar array_upper en postgres 8.2.

Sean Anderson
fuente
Salvavidas. Como casi todas las publicaciones están usando array_length () asumiendo que las personas están en postgres 9+; (
uniquegino