Хранить вывод запроса select в одном массиве в postgres

86

Мой код:

SELECT column_name
FROM information.SCHEMA.columns
WHERE table_name = 'aean'

Он возвращает имена столбцов таблицы aean.
Теперь я объявил массив:

DECLARE colnames text[]

Как я могу сохранить вывод select в массиве colnames.
Есть ли необходимость инициализировать имена столбцов?

клещ
источник
+1, я пришел сюда с точно таким же сообщением об ошибке - ОШИБКА: не удалось найти тип массива для типа данных information_schema.sql_identifier. array_agg(column_name, ',')
Пытался

Ответы:

150

Есть два пути. Один из них - агрегировать:

SELECT array_agg(column_name::TEXT)
FROM information.schema.columns
WHERE table_name = 'aean'

Другой - использовать конструктор массива:

SELECT ARRAY(
SELECT column_name 
FROM information.schema.columns 
WHERE table_name = 'aean')

Я предполагаю, что это для plpgsql. В этом случае вы можете назначить это так:

colnames := ARRAY(
SELECT column_name
FROM information.schema.columns
WHERE table_name='aean'
);
Дени де Бернарди
источник
Можете ли вы дать мне код, который работает на postgres, потому что он не работает на postgres ОШИБКА: не удалось найти тип массива для типа данных information_schema.sql_identifier
mitesh
Извини за это. Бездумное копирование и вставка включили array_agg () во все три вызова. Я также напечатал начальную версию, чтобы сделать вашу версию PG счастливой.
Дени де Бернарди
9
Для тех, кто смотрит дальше в части plpgsql, вы можете DECLAREиспользовать массив как my_array INTEGER[];(или любой другой соответствующий тип). Вы также можете использовать массив в предложении запроса, WHEREнапример WHERE values = ANY(my_array). Объект ANYпринимает массив или набор и проверяет его присутствие в этом массиве / наборе, поэтому IN ()в определенном смысле он функционирует аналогично
user2490003
11

У меня была точно такая же проблема. Еще одна рабочая модификация решения Дениса (необходимо указать тип):

SELECT ARRAY(
SELECT column_name::text
FROM information_schema.columns
WHERE table_name='aean'
)
птски
источник
1
Похоже, что это уже не так.
Soviut