从表中检索列名 -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的主要内容,如果未能解决你的问题,请参考以下文章

如何从表中检索自增字段名称?

只需从配置单元表中获取列名

从表中检索的条目是不是重复? PHP

Entity Framework Core 从表中检索单个对象

从表中检索最后 N 条记录

如何从表中检索我的最后一个插入行?