我正在动态查询一些表可能没有特定列的表。我的目的是检查列的存在并动态分配一个值。基本上,如果所有表都包含该字段,我只会简单地写:
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消息一个)不支持 红移表。;
答案 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,以进行汇总。
说了这么多,我很警惕用这种方式处理丢失的列。