假设我们有一个包含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')的列。
我的语法,思维方式或其他方面可能出现什么问题?提前致谢!
您可以使用参数创建和调用函数。该函数将动态选择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' );