Redshift-CASE语句检查列EXISTS或否

时间:2019-03-11 15:57:58

标签: sql amazon-redshift

我正在动态查询一些表可能没有特定列的表。我的目的是检查列的存在并动态分配一个值。基本上,如果所有表都包含该字段,我只会简单地写:

select name, count(k_val) from tbl GROUP by 1 

但就我而言,我需要执行以下操作:

select name, 
    SUM( (CASE when (select EXISTS( SELECT * FROM pg_table_def WHERE tablename = 'tbl'
                                            and "column" = 'k_val')) 
                then 1 else 0 end) ) as val  
    from tbl GROUP by 1

我遇到了错误:

  

SQL错误[500310] [0A000]:Amazon无效的操作:   指定的类型或功能(每个INFO消息一个)不支持   红移表。;

1 个答案:

答案 0 :(得分:2)

以下是适用于大多数数据库以处理丢失的列的技巧。

select t.*,
       (select k_val  -- intentionally not qualified
        from tbl t2
        where t2.pk = t.pk
       ) new_k_val
from tbl t cross join
     (select NULL as k_val) k;

pk是表的主键列。这使用范围规则来查找k_val的值。如果表中有k_val,则子查询将使用该行中的值。如果不是,则作用域将“扩展”并从k中获取值。在这种情况下没有混乱,因为k_val不在tbl中。

如果由于某种原因不希望使用常量子查询,则可以始终使用:

     (select NULL as k_val from t limit 1) k

然后,您可以将其用作子查询或CTE,以进行汇总。

说了这么多,我很警惕用这种方式处理丢失的列。