Как узнать размер массива в 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и это было очень удобно. Может, тянусь к нему из-за комфорта?

jc00ke
источник
3

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

Шон Андерсон
источник
Спасатель жизни. Поскольку почти во всех публикациях используется array_length (), предполагая, что люди используют postgres 9+; (
uniquegino