从表中检索列名 -Redshift
Posted
技术标签:
【中文标题】从表中检索列名 -Redshift【英文标题】:Retrieving column names from table -Redshift 【发布时间】:2018-05-07 08:14:32 【问题描述】:我有一张如下表:
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)
【问题讨论】:
以防万一,添加架构条件。 今日提示:切换到现代、明确的JOIN
语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。
尝试添加模式条件,仍然输出相同
嗨添加一些示例数据..
对于我的应用,我不需要在表格中插入任何值,只需要查看表格的信息
【参考方案1】:
pg_attribute 表包含表示主键等的行以及列。由于您已将场地 ID 定义为 IDENTITY 列,因此场地 ID 有一个额外的行表示表的身份属性。
您可以通过在查询中引用 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”行之一,您会看到 relname 是“venue_ident_pkey”而不是“venue_ident”。
如果您只需要表的列名,则在pc.relname='venue_ident'
(表名)上添加一个额外的 WHERE 子句过滤器。
【讨论】:
@Arora - 如果它回答了您的问题,请将其标记为答案 - 这有助于其他读者了解该响应是否良好。 :) AND pc.relname = c.table_name以上是关于从表中检索列名 -Redshift的主要内容,如果未能解决你的问题,请参考以下文章