วิธีค้นหาตารางที่มีคอลัมน์เฉพาะใน postgresql


คำตอบ:


65

คุณสามารถสอบถามแคตตาล็อกระบบ :

select c.relname
from pg_class as c
    inner join pg_attribute as a on a.attrelid = c.oid
where a.attname = <column name> and c.relkind = 'r'

sql fiddle demo


1
โปรดทราบว่าข้อความค้นหานี้ดูเหมือนจะไม่ยอมรับสัญลักษณ์แทน '%' ในขณะที่คำถามในคำตอบของ Ravi ตอบ
Skippy le Grand Gourou

@SkippyleGrandGourou ยอมรับ "ชอบ 'id%'"
jutky

สิ่งนี้ใช้ไม่ได้สำหรับฉันที่มีหรือไม่มีสัญลักษณ์แทนฉันต้องใช้ information.schema เพื่อค้นหา
Lrawls

151

คุณยังสามารถทำได้

 select table_name from information_schema.columns where column_name = 'your_column_name'

1
แปลกฉันเคยเห็นกรณีที่แบบสอบถามนี้แสดงตารางที่แบบสอบถามของ @ RomanPekar ไม่ได้; ฉันสงสัยว่าทำไมถึงเป็นเช่นนั้น
Ken Bellows

1
@KenBellows ฉันเดาว่า pg_class / pg_attirbute สามารถเปลี่ยนด้วย Postgresql เวอร์ชันใหม่ได้ในขณะที่ information_schema ถูกกำหนดไว้ในข้อกำหนด ANSI ดังนั้นสำหรับคำถามทั่วไปฉันว่าคำตอบนี้ดีกว่า บางครั้งฉันต้องมีรหัสวัตถุเช่นในกรณีนี้ฉันต้องใช้ตารางเฉพาะของ db-engine นอกจากนี้มุมมอง information_schema ยังเป็นขั้นตอนเพิ่มเติมสำหรับตารางเฉพาะของเครื่องยนต์ db และบางครั้งอาจนำไปสู่ประสิทธิภาพที่แย่ลง (เล็กน้อย)
Roman Pekar

นี่เป็นความแม่นยำมากขึ้นของสองโซลูชันที่นำเสนอ - ในกรณีของฉัน แบบสอบถาม pg_class พลาดตารางสอง (จาก 150) ตาราง แบบสอบถาม information_schema จับตารางทั้งหมด ฉันจะต้องขุดคุ้ยเพื่อดูว่าเหตุใดสองโต๊ะจึงตกอยู่นอกการเข้าร่วม ขอบคุณสำหรับข้อมูลในทุกกรณี!
Thomas Altfather Good

7

ฉันใช้คำค้นหาของ @Roman Pekar เป็นฐานและเพิ่มชื่อสคีมา (เกี่ยวข้องในกรณีของฉัน)

select n.nspname as schema ,c.relname
    from pg_class as c
    inner join pg_attribute as a on a.attrelid = c.oid
    inner join pg_namespace as n on c.relnamespace = n.oid
where a.attname = 'id_number' and c.relkind = 'r'

sql fiddle demo


1

เพียงแค่:

$ psql mydatabase -c '\d *' | grep -B10 'mycolname'

ขยาย -B ออฟเซ็ตเพื่อรับชื่อตารางหากต้องการ


1

Wildcard Support ค้นหาสคีมาของตารางและชื่อตารางที่มีสตริงที่คุณต้องการค้นหา

select t.table_schema,
       t.table_name
from information_schema.tables t
inner join information_schema.columns c on c.table_name = t.table_name
                                and c.table_schema = t.table_schema
where c.column_name like '%STRING%'
      and t.table_schema not in ('information_schema', 'pg_catalog')
      and t.table_type = 'BASE TABLE'
order by t.table_schema;

0
select t.table_schema,
       t.table_name
from information_schema.tables t
inner join information_schema.columns c on c.table_name = t.table_name 
                                and c.table_schema = t.table_schema
where c.column_name = 'name_colum'
      and t.table_schema not in ('information_schema', 'pg_catalog')
      and t.table_type = 'BASE TABLE'
order by t.table_schema;

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