Получение списка значений в виде массива
У меня есть этот запрос:
SELECT id FROM a
id
имеет тип integer
Я хочу получить результат в виде целочисленного массива: [26053,26021]
, этот результат возвращается в функцию, которая выполняет итерации по элементам.
На основании того, что я прочитал в руководстве, я написал этот запрос:
select array_to_string( array( SELECT id FROM a where ... ), ',' )
Дело в том, что он возвращает мне строку 26053,26021
и когда я повторяю результат, он делает:
... (id =2 or id =6 or id =0 or id =5 or id =3 or id =,
or id =2 or id =6 or id =0 or id =2 or id =1)
Как вы можете видеть, он обрабатывает результат как строку, а не как массив, каждый символ является элементом.
Как мне получить только массив? Это единственное решение для преобразования строки обратно в массив? Разве нет способа конвертировать его напрямую?
1 ответ
Для простого случая с одной строкой результата лучше всего использовать конструктор массива (самый простой, самый быстрый). У вас уже есть это, просто удалите array_to_string()
, который преобразует массив в строку (как следует из названия):
SELECT ARRAY(SELECT id FROM a WHERE ... ) AS id_arr;
Для случаев с несколькими строками результатов обратитесь к статистической функции array_agg()
, Пример:
SELECT b, array_agg(id) AS id_arr
FROM a
WHERE ...
GROUP BY b;
В сторону:
Стандартный синтаксис Postgres для константы массива (текстовое представление массива) будет '{26053,26021}'
- с фигурными скобками и в одинарных кавычках. В зависимости от контекста вам может понадобиться или нет добавление явного приведения: '{26053,26021}'::int[]
Или вы можете использовать другой конструктор массива, на этот раз основанный на целочисленных константах вместо подзапроса: ARRAY[26053,26021]
,
[26053,26021]
что-то среднее, что не сработает в любом случае.