Как узнать размер массива в postgresql


98

Есть ли способ узнать размер массива?

Например,

CREATE TABLE example (id integer[]) ;

INSERT INTO exam VALUES ( '{}');

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

Отсюда можно ли получить такой результат, как:

size

0

3

Ответы:


120

Как сказал Вегоров, свое дело array_lengthсделает. Или, если вы знаете, что массив одномерный (что вероятно) и работаете с PostgreSQL 9.4 или выше, вы можете использовать cardinality:

SELECT cardinality(id) FROM example;

10
Если кто-нибудь может упомянуть о большой разнице в использовании array_length и cardinality, это было бы здорово
Zia Ul Rehman Mughal

6
cardinalityвозвращает количество всех элементов в одном или многомерном массиве. Так select cardinality(ARRAY[[1,2], [3,4]]);бы вернулся 4, тогда как select array_length(ARRAY[[1,2], [3,4]], 1)вернулся бы 2. Если вы считаете первое измерение, array_lengthэто более безопасная ставка.
Рошамбо

2
Это также работает для массива, сохраненного в поле с textтипом, while function array_length(text[]) does not exist;)
santuxus

1
@ZiaUlRehmanMughal также длина массива пустого массива неожиданно имеет значение , nullа не 0тогда cardinalityвозвращает то , что вы ожидали бы. Понятия не имею, о чем они думали с такой логикой.
EoghanM

82

Это банальное чтение документов :

SELECT array_length(id, 1) FROM example;

13
Вы знаете, что такое второй параметр функции array_length. Не нашел этой информации в документах.
suzanshakya 04

19
@suzanshakya, длина запрошенного измерения массиваツ
vyegorov 04

5
Это вернет nulland 3вместо 0и 3для примера OPs. Определенно следует продвигать использование cardinalityпри принятии ответа, поскольку это проще в использовании и менее неожиданно (я полагаю, что использование массивов на 99,999% является одномерным)
EoghanM


9

Предполагая, что размерность массива всегда будет равняться 1, я не чувствую себя комфортно, поэтому я выбрал следующее:

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

Прошло ... по крайней мере десять лет, но мы много работали, coalesceи это было очень удобно. Может, тянусь к нему из-за комфорта?


3

Пришлось использовать array_upper в postgres 8.2.


Спасатель жизни. Поскольку почти во всех публикациях используется array_length (), предполагая, что люди используют postgres 9+; (
uniquegino
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.