Зберігайте вихідні дані запиту в одному масиві в postgres


86

Мій код:

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

Він повертає імена стовпців таблиці aean.
Тепер я оголосив масив:

DECLARE colnames text[]

Як я можу зберігати вихідні дані select у масиві colnames.
Чи потрібна ініціалізація імен col?


+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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.