Есть ли способ узнать размер массива?
Например,
CREATE TABLE example (id integer[]) ;
INSERT INTO exam VALUES ( '{}');
INSERT INTO exam VALUES ( '{5,6,7}');
Отсюда можно ли получить такой результат, как:
size
0
3
Ответы:
Как сказал Вегоров, свое дело array_length
сделает. Или, если вы знаете, что массив одномерный (что вероятно) и работаете с PostgreSQL 9.4 или выше, вы можете использовать cardinality
:
SELECT cardinality(id) FROM example;
cardinality
возвращает количество всех элементов в одном или многомерном массиве. Так select cardinality(ARRAY[[1,2], [3,4]]);
бы вернулся 4
, тогда как select array_length(ARRAY[[1,2], [3,4]], 1)
вернулся бы 2
. Если вы считаете первое измерение, array_length
это более безопасная ставка.
text
типом, while function array_length(text[]) does not exist
;)
null
а не 0
тогда cardinality
возвращает то , что вы ожидали бы. Понятия не имею, о чем они думали с такой логикой.
Это банальное чтение документов :
SELECT array_length(id, 1) FROM example;
array_length
. Не нашел этой информации в документах.
null
and 3
вместо 0
и 3
для примера OPs. Определенно следует продвигать использование cardinality
при принятии ответа, поскольку это проще в использовании и менее неожиданно (я полагаю, что использование массивов на 99,999% является одномерным)
Предполагая, что размерность массива всегда будет равняться 1, я не чувствую себя комфортно, поэтому я выбрал следующее:
SELECT coalesce(array_length(id, 1), 0) as size FROM example;
Прошло ... по крайней мере десять лет, но мы много работали, coalesce
и это было очень удобно. Может, тянусь к нему из-за комфорта?
Пришлось использовать array_upper в postgres 8.2.