Cách tìm một bảng có một cột cụ thể trong postgresql


92

Tôi đang sử dụng PostgreSQL 9.1. Tôi có tên cột của một bảng. Có thể tìm thấy (các) bảng có / có cột này không? Nếu vậy, làm thế nào?

Câu trả lời:


62

bạn có thể truy vấn danh mục hệ thống :

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
Lưu ý rằng truy vấn này dường như không chấp nhận ký tự đại diện '%', trong khi truy vấn trong câu trả lời của Ravi thì có.
Skippy le Grand Gourou

@SkippyleGrandGourou Nó chấp nhận "like 'id%'"
jutky

điều này không phù hợp với tôi khi có hoặc không có ký tự đại diện, tôi phải sử dụng information.schema để tìm kiếm
Lrawls 14/02/19

144

Bạn cũng có thể làm

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

1
kỳ lạ, tôi đã thấy các trường hợp mà truy vấn này hiển thị các bảng mà truy vấn của @ RomanPekar thì không; Tôi tự hỏi tại sao điều đó sẽ là
Ken Bellows

1
@KenBellows Tôi đoán pg_class / pg_attirbute có thể thay đổi với các phiên bản mới của Postgresql trong khi information_schema được định nghĩa trong đặc tả ANSI. Vì vậy, đối với các truy vấn chung, tôi muốn nói câu trả lời này tốt hơn. Đôi khi tôi cần phải có id đối tượng chẳng hạn, trong trường hợp này tôi cần sử dụng các bảng cụ thể của db-engine. Thêm vào đó, chế độ xem information_schema luôn là một bước bổ sung so với các bảng cụ thể của công cụ db và đôi khi có thể dẫn đến hiệu suất kém hơn (một chút)
Roman Pekar 18/02

Đây là giải pháp chính xác hơn trong số hai giải pháp được cung cấp - trong trường hợp của tôi. Truy vấn pg_class đã bỏ lỡ hai (trong số 150) bảng. Truy vấn information_schema chiếm tất cả các bảng. Tôi sẽ phải tìm hiểu xung quanh để xem tại sao có hai bảng nằm ngoài cuộc tham gia. Trong bất kỳ sự kiện nào, cảm ơn vì thông tin!
Thomas Altfather Good

7

Tôi đã sử dụng truy vấn @Roman Pekar làm cơ sở và thêm tên lược đồ (có liên quan trong trường hợp của tôi)

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

Đơn giản:

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

Phóng to -B offset để lấy tên bảng, nếu cần


1

Hỗ trợ ký tự đại diện Tìm lược đồ bảng và tên bảng có chứa chuỗi bạn muốn tìm.

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;

2
Vui lòng chỉnh sửa câu trả lời của bạn để bao gồm giải thích cho mã của bạn. Câu hỏi đã hơn sáu năm tuổi và đã có một câu trả lời được chấp nhận bên cạnh một số câu trả lời được nhiều người ủng hộ và giải thích rõ ràng. Nếu không có lời giải thích như vậy về câu trả lời của bạn, nó có thể bị phản đối hoặc loại bỏ. Thêm thông tin bổ sung đó sẽ giúp chứng minh cho câu trả lời của bạn tiếp tục tồn tại ở đây.
Das_Geek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.