用其他表中的某些列创建表

时间:2019-03-29 15:59:03

标签: sql postgresql

假设我们有一个包含200个不同列的表A。我们要选择包含某个子字符串的列(例如,“ host_id”,“ host_name”,“ average_host_rating”中的“ host”子字符串),并创建一个仅包含这些列及其从.csv文件导入的数据的新表B 。

我尝试手动创建新表,但这不是一个好习惯,即使我向表A添加了更多列,我也希望通过使其有效和起作用来改进代码。

手动创建表:

SELECT 
   listings.host_id,
   listings.host_url ,
   ..
   ..
   listings.host_name ,
   listings.host_since ,
INTO host_table
FROM listings
WHERE TRUE;

尝试以更好的方式创建表:

CREATE TABLE B AS 
SELECT  *
FROM    A
WHERE  A::text LIKE '%host%'

我希望它创建表B,每列的名称中都包含“ host”,但是它返回表A的精确副本(及其所有数据)。我尝试了不同的方式和方法来创建新表,但是问题始终是我无法仅隔离具有指定子字符串(“主机”)的列。

我的语法,思维方式或其他方面可能有什么问题? 预先感谢!

1 个答案:

答案 0 :(得分:0)

您可以创建并调用带有参数的函数。该函数将从information_schema.columns中动态选择列。

请注意,使用where false是因为您提到的数据将来自csv文件而不是原始表。

create or replace function 
   fn_gen_tab_text ( curr_tab_in text,tab_text_in TEXT, new_tab_in text)
 RETURNS void AS
  $body$
 declare v_sql TEXT;
  BEGIN
   select 'CREATE TABLE %I AS select ' || string_agg(column_name,',') 
        ||' from %I where false'
      into v_sql from information_schema.columns  
   where table_name = curr_tab_in
   and column_name like '%'||tab_text_in||'%';
   EXECUTE format (v_sql,new_tab_in,curr_tab_in);
 END $body$ language plpgsql 

命名为

select fn_gen_tab_text('host_table','host','new_table' );

DEMO