使用另一个表中的某些列创建表

问题描述 投票:0回答:1

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

我尝试手动创建新表,但这不是一个好习惯,我想通过使代码有效和功能来改进代码,即使我向表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(及其所有数据)的精确副本。我尝试了创建新表的不同方法和方法,但问题始终是我无法仅隔离具有指定子字符串('host')的列。

我的语法,思维方式或其他方面可能出现什么问题?提前致谢!

sql postgresql
1个回答
0
投票

您可以使用参数创建和调用函数。该函数将动态选择qazxsw poi中的列。

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

where false

称之为

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' );

© www.soinside.com 2019 - 2024. All rights reserved.