首页 > 解决方案 > Redshift :根据table_1中是否存在column,创建另一个表并分配column值

问题描述

我在 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'

我确信它已经存在于'table_1'中。

  1. 选择我不确定是否存在于“table_1”中的名为“column_n”的列。如果 'table_1' 中存在 'column_n',则按原样选择它,如果不存在,则在 'temp_table' 中创建一个名为 'column_n' 的列,并为其所有行分配一个字符值 'val_n'。

所以我最终的“temp_table”将如下所示:

  1. 如果“table_1”中存在“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' 中不存在 '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
....           ....            ....            ....   

我试图从这个链接中得到一些提示:如何使用 SQL 语句测试表中是否存在列,但不知何故,我没有成功测试创建临时表中的条件。

标签: sqlcaseamazon-redshiftcreate-tablealter-table

解决方案


这真的很棘手。假设您有某种独特的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没有列。


推荐阅读