Redshift:根据table_1中是否存在列,创建另一个表并指定列值

时间:2018-05-17 17:35:42

标签: sql case amazon-redshift create-table alter-table

我在Redshift中有一个名为'table_1'的表,列名为'column_name_1','column_name_2','column_name_3'.......'column_m'等。

table_1
column_name_1   column_name_2   column_name_3   column_name_4   ....   column_name_m    

我想基于以下条件创建一个名为'temp_table'的临时表:

  1. 选择名为的3列 'column_name_1','column_name_2','column_name_3'
  2. 我肯定已经存在于'table_1'中。

    1. 选择名为'column_n'的列,我不确定'table_1'中是否存在该列。如果'table_1'中存在'column_n',则按原样选择它,如果它不存在,则在'temp_table'中创建一个名为'column_n'的列,并为其分配一个字符值'val_n'所有行。
    2. 所以我的最终'temp_table'将如下所示:

      1. 如果'table_1'
      2. 中存在'column_n'

        temp_table

        column_name_1  column_name_2   column_name_3   column_n
        col_1_val_1    col_2_val_1     col_3_val_1     col_n_val_1
        col_1_val_2    col_2_val_2     col_3_val_2     col_n_val_2
        col_1_val_3    col_2_val_3     col_3_val_3     col_n_val_3
        ....           ....            ....            ....   
        
        1. 如果'table_1'
        2. 中不存在'column_n'

          temp_table

          column_name_1  column_name_2   column_name_3   column_n
          col_1_val_1    col_2_val_1     col_3_val_1     val_n
          col_1_val_2    col_2_val_2     col_3_val_2     val_n
          col_1_val_3    col_2_val_3     col_3_val_3     val_n
          ....           ....            ....            ....   
          

          我试图从这个链接中获取一些提示:How can I test if a column exists in a table using an SQL statement,但不知怎的,我没有成功测试创建临时表的条件。

2 个答案:

答案 0 :(得分:1)

这真的很棘手。假设您有某种独特的id列,您可以这样做:

select t1.column1, t1.column2, t1.column3,
       (select column_n  -- not qualified on purpose
        from table1 tt1
        where tt1.id = t1.id
       ) as column_n
from table1 t1 cross join
     (select val_n as column_n) x;

这使用作用域逻辑来解析子查询中的column_n。如果列存在于table1中,则使用内部引用来填充值。如果不是,则使用x中的列。在这种情况下没有冲突的危险,因为table1没有列。

答案 1 :(得分:0)

这不是您应该通过SQL查询尝试做的事情。

相反,使用系统表和视图(如SVV_TABLES)检索有关表的信息,然后构造适当的SQL语句以选择/插入数据。

为了澄清,确定哪些列存在以及要插入/复制哪些列的逻辑应该在Amazon Redshift 之外完成。然后,将生成的命令发送到Redshift以与数据进行交互。