如何在 SELECT a.*, b.* 中自动重命名列名以具有 ie。结果列名称中的前缀 a_ 和 b_?

zim*_*mon 5 sql postgresql syntax

我有两个表 (a,b),或将表连接到自身,具有相同的列名。(表很宽,大约有一百列。)

使用:

SELECT a.*, b.*
FROM a LEFT JOIN b ON b.id=a.id AND b.date1=a.date2;
Run Code Online (Sandbox Code Playgroud)

... 有效,但现在如果我想从中查看:

CREATE OR REPLACE VIEW v_test_ab AS
SELECT a.*, b.*
FROM a LEFT JOIN b ON b.id=a.id AND b.date1=a.date2;
Run Code Online (Sandbox Code Playgroud)

...它无法创建视图,因为会有多个具有相同名称的列。

在 PostgreSQL 中,有没有办法使用给定的模式自动重命名结果表的列名?

示例如下:

CREATE OR REPLACE VIEW v_test_ab AS
SELECT a.* AS a_*, b.* AS b_*
FROM a LEFT JOIN b ON b.id=a.id AND b.date1=a.date2;
Run Code Online (Sandbox Code Playgroud)

或者可能是这样的:

SELECT a.* AS generate_column_names('a_%', a.*)
      , b.* AS generate_column_names('b_%', b.*)
Run Code Online (Sandbox Code Playgroud)

避免需要写:

CREATE OR REPLACE VIEW v_test_ab AS
SELECT 
    a.id as a_id, a.date1 as a_date1, a.date2 as a_date2 -- and so on 
    , b.id as b_id, b.date1 as b_date1, b.date2 as b_date2 -- and so on
FROM a LEFT JOIN b ON b.id=a.id AND b.date1=a.date2;
Run Code Online (Sandbox Code Playgroud)

我当然可以在 IDE 编辑器中使用模式匹配搜索和替换,但最终结果看起来很臃肿。(我拥有的真实世界案例有四个具有许多相同列名的宽源表。)

JGH*_*JGH 4

虽然可以将创建查询包装在一条execute语句中,加入目录以获取表名和列名,但这将很难阅读。

相反,最简单、最快速的方法是自动构建列列表并将其复制 - 粘贴到查询中。

作为奖励,当有人要求重命名/更改/删除特定列时,会有其使用情况的书面记录。

SELECT table_name || '.' || column_name || ' as a_' || column_name || ', ' 
FROM information_schema.columns 
WHERE table_schema = 'my_schema' 
  AND table_name= 'my_tablename';

         ?column?
-------------------------
 my_tablename.id as a_id,
 my_tablename.title as a_title,
 my_tablename.a as a_a,
Run Code Online (Sandbox Code Playgroud)