Получение имен столбцов из таблицы -Redshift - PullRequest
0 голосов
/ 07 мая 2018

У меня есть таблица, как показано ниже:

create table venue_ident

(venueid bigint identity(0, 1)NOT NULL,
 venuename varchar(100) default 'city',
 venuecity varchar(30),
 venuestate char(2),
 venueseats integer,
 primary key(venueid));

Всякий раз, когда я использую запрос

 select DISTINCT c.column_name,
 a.attencodingtype,
 a.attnotnull,
 a.atttypid::regtype,
 a.attnum

FROM   pg_attribute a , information_schema.columns c ,PG_TABLE_DEF as p
where    attnum > 0
 AND    NOT attisdropped
 AND c.ordinal_position=a.attnum
 and c.column_name=a.attname
 and c.table_name='venue_ident'
 and a.attnotnull=p.notnull

ORDER by a.attnum;

Всегда выводит 6 столбцов вместо 5. Он показывает столбец первичного ключа (venue_id) дважды с различными значениями для ненулевого условия. Как мне получить только 5 столбцов

(venueid, venuename, venuecity, venuestate, venueseats)

1 Ответ

0 голосов
/ 13 мая 2018

Таблица pg_attribute содержит строки для представления первичных ключей и т. Д., А также столбцы.Поскольку вы определили venueid как столбец IDENTITY, для venueid есть дополнительная строка, которая представляет свойство идентификации таблицы.

Это можно увидеть, сославшись на pg_class в запросе и посмотрев значение relname:

    SELECT 
 c.column_name,
 a.attencodingtype,
 a.attnotnull,
 a.atttypid::regtype,
 a.attnum, 
 pc.relname
FROM   
    pg_attribute a 
    INNER JOIN information_schema.columns c ON c.ordinal_position=a.attnum  and c.column_name=a.attname
    INNER JOIN pg_class pc ON a.attrelid = pc.oid
where    
    a.attnum > 0
    AND NOT a.attisdropped
    and c.table_name='venue_ident'
ORDER by a.attnum;

Для одной из строк «venueid» вместо «venue_ident_pkey» вместо «venue_ident» будет указано relname.

Если вам нужны только имена столбцов таблицызатем добавьте дополнительный фильтр предложения WHERE в pc.relname='venue_ident' (имя таблицы).

...