จัดเก็บผลลัพธ์ของแบบสอบถามที่เลือกไว้ในอาร์เรย์เดียวใน postgres


88

รหัสของฉันคือ:

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

aeanก็จะส่งกลับชื่อคอลัมน์ของตาราง
ตอนนี้ฉันได้ประกาศอาร์เรย์แล้ว:

DECLARE colnames text[]

ฉันจะจัดเก็บเอาต์พุตของ Select ในอาร์เรย์ colnames ได้อย่างไร
จำเป็นต้องเริ่มต้นชื่อ colnames หรือไม่?


+1 ฉันมาถึงที่นี่พร้อมกับข้อความแสดงข้อผิดพลาดเดียวกันทุกประการ - ข้อผิดพลาด: ไม่พบประเภทอาร์เรย์สำหรับประเภทข้อมูล information_schema.sql_identifier กำลังพยายามกับarray_agg(column_name, ',')
jerrymouse

คำตอบ:


151

มีสองวิธี หนึ่งคือการรวม:

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 ของคุณมีความสุข
Denis de Bernardy

9
สำหรับใครก็ตามที่กำลังมองหาเพิ่มเติมเกี่ยวกับส่วน plpgsql คุณสามารถDECLAREจัดเรียงอาร์เรย์เป็นmy_array INTEGER[];(หรือประเภทใดก็ได้ที่เกี่ยวข้อง) นอกจากนี้คุณยังสามารถใช้อาร์เรย์ในแบบสอบถามของข้อเช่นWHERE ใช้เวลาอาร์เรย์หรือชุดและจะตรวจสอบการแสดงตนในที่อาร์เรย์ / ชุดเพื่อทำหน้าที่เท่าที่จะอยู่ในความรู้สึกWHERE values = ANY(my_array)ANYIN ()
user2490003

11

ฉันมีปัญหาเดียวกัน การปรับเปลี่ยนการทำงานอีกครั้งหนึ่งของโซลูชันที่ Denis กำหนด (ต้องระบุประเภท)

SELECT ARRAY(
SELECT column_name::text
FROM information_schema.columns
WHERE table_name='aean'
)

1
ดูเหมือนจะไม่เป็นเช่นนั้นอีกต่อไป
Soviut
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.