一尘不染

在SQL中将表名放在结果集中的每一列之前?(特别是Postgres)

sql

如何获得结果集中各列的标签,以便在表的名称前加上名称?

我希望对单个表以及联接进行查询。

例子:

  SELECT first_name, last_name FROM person;

我希望结果是:

 | person.first_name | person.last_name |
 |-------------------|------------------|
 | Wendy             | Melvoin          |
 | Lisa              | Coleman          |

我可以使用“ AS”为每列定义一个别名,但这会很乏味。我希望这是自动发生的。

  SELECT first_name AS person.first_name, last_name AS person.last_name FROM person;

我提出这个问题的原因是,我使用的数据库驱动程序不提供元数据,该数据通知我从结果集获取其数据的数据库列。我正在尝试编写通用代码来处理结果集。

我想知道一般如何在SQL中执行此操作,或者至少在Postgres中特别如此。

SQLite具有这样的功能,尽管我现在莫名其妙地不推荐使用它。SQLite具有两个编译指示设置:full_column_namesshort_column_names


阅读 209

收藏
2021-03-10

共1个答案

一尘不染

我知道这个问题有点老了,但也许有人会偶然发现答案,这将对他们有所帮助。

做您要寻找的东西的正确方法是创建和使用视图。是的,一次性输入所有这些新列名称作为别名会有点乏味,但是如果有很多列,则可以使用一种技巧来利用PostgreSQL元数据写出视图文本:

select 'CREATE OR REPLACE VIEW people AS SELECT ' || 
(select string_agg(column_name || ' AS person_' || column_name, ', ')
from information_schema.columns
where table_name = 'person'
group by table_name) || 
' FROM person;';

运行此结果:

?column?                                                 
------------------------------------------------------------------------------------------------------------- 
CREATE OR REPLACE VIEW people AS SELECT last_name AS person_last_name, first_name AS person_first_name FROM person;

1 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
[Executed: 4/21/12 2:05:21 PM EDT ] [Execution: 9/ms]

然后,您可以复制并执行结果,瞧:

select * from people;

 person_last_name     person_first_name    
 -------------------  -------------------- 
 Melvoin              Wendy                
 Coleman              Lisa

 2 record(s) selected [Fetch MetaData: 1/ms] [Fetch Data: 0/ms]
2021-03-10