PostgreSQL: длина JSON-массива
Выберите функцию по типу данных: json_array_length для json, jsonb_array_length для jsonb. Если массив вложен в объект, сначала извлеките его оператором ->, который сохраняет JSON-значение.
Минимальный запрос
SELECT json_array_length(
'{"numbers": [1, 2, 3, 4, 5]}'::json -> 'numbers'
) AS count;
-- 5
SELECT jsonb_array_length('[1, 2, null]'::jsonb);
-- 3JSON null внутри массива — элемент и входит в длину. Функция не считает рекурсивно содержимое вложенных массивов: [[1,2],[3]] имеет длину2.
Если поле бывает другого типа
SELECT CASE
WHEN jsonb_typeof(data -> 'numbers') = 'array'
THEN jsonb_array_length(data -> 'numbers')
ELSE NULL
END AS count
FROM my_table;Здесь data — столбец jsonb. Поле с объектом или JSON null не следует передавать функции как массив. Отсутствующий ключ возвращает SQL NULL; это отличается от пустого массива с длиной0. Решение, превращать ли отсутствие в0, должно следовать смыслу данных.
Проверка
Используйте случаи [], [1], вложенный массив, отсутствующее поле и неверный тип. Если нужны элементы для обработки, функции json[b]_array_elements решают другую задачу; для длины не нужно разворачивать весь массив в строки вручную.