如何在SELECT a.*、b.*中自动重命名列名,以便在结果列名中使用前缀a_和b_



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

使用:

SELECT a.*, b.*
FROM a LEFT JOIN b ON b.id=a.id AND b.date1=a.date2;

有效,但现在如果我想从中得出一个观点:

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;

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

在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;

或者类似于:

SELECT a.* AS generate_column_names('a_%', a.*)
, b.* AS generate_column_names('b_%', b.*)

避免需要写入:

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;

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

虽然可以将创建查询包装在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,

最新更新