Як знайти таблицю з певним стовпцем у postgresql


92

Я використовую PostgreSQL 9.1. У мене є назва стовпця таблиці. Чи можна знайти таблиці (таблиці), які містять / мають цей стовпець? Якщо так, то як?

Відповіді:


62

Ви можете запитати системні каталоги :

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
Зверніть увагу, що цей запит, здається, не приймає символів підстановки '%', тоді як запит у відповіді Раві приймає.
Skippy le Grand Gourou

@SkippyleGrandGourou Він приймає "як" id% ""
дратівливий

це у мене не працювало з
узагальнюючими символами

144

Ви також можете зробити

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

1
як не дивно, я бачив випадки, коли цей запит показує таблиці, яких запит @ RomanPekar не робить; Цікаво, чому це було б
Кен Беллоус

1
@KenBellows Я думаю, pg_class / pg_attirbute може змінюватися з новими версіями Postgresql, тоді як information_schema визначається у специфікації ANSI. Тому для загальних запитів я б сказав, що така відповідь є кращою. Іноді мені потрібно мати ідентифікатор об'єкта, наприклад, у цьому випадку мені потрібно використовувати таблиці конкретних db-engine. Крім того, подання information_schema завжди є додатковим кроком до таблиць, що відповідають дб-двигуну, і іноді можуть призвести до (трохи) гіршої продуктивності
Роман Пекар

Це було точніше з двох запропонованих рішень - у моєму випадку. Запит 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

Підтримка символів підстановки Знайдіть схему таблиці та назву таблиці, яка містить рядок, який потрібно знайти.

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