Получение списка значений в виде массива

У меня есть этот запрос:

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] что-то среднее, что не сработает в любом случае.

Другие вопросы по тегам