首页 > 解决方案 > BigQuery:如果存在则选择列,否则将其设为 NULL?

问题描述

我正在更新每日仪表板。假设每天我有两张桌子TODAYBEFORE_TODAY. 我每天都在做的事情是这样的:

SELECT a, b FROM TODAY
UNION ALL
SELECT a,b FROM BEFORE_TODAY;

TODAY表每天生成并附加到它之前的所有数据中。现在,我需要生成一个新列c,为了将这两者联合起来,我也需要它可用BEFORE_TODAY

如何添加条件语句来BEFORE_TODAY检查我是否有c列并使用该列,否则使用NULL它来代替它。

标签: sqlgoogle-bigquery

解决方案


您的数据模型有问题。您应该将数据放入同一张表的不同分区中。那么你就没有问题了。你可以只查询你想要的分区的主表。该列将出现在历史记录中,并带有一个NULL值。

这是正确的解决方案。假设您的表有一个主键,您可以创建一个被黑的解决方案。例如,如果a, b每一行都是唯一的,你可以这样做:

select t.a, t.b, t.c
from today t
union all
select b.a, b.b,
       (select c  -- not qualified on purpose
        from before_today b2
        where b2.a = b.a and b2.b = b.b
       ) as 
from before_today b cross join
     (select null as c) c;

如果b.c不存在,则子查询返回c.c。如果它确实存在,它将b2.c从子查询返回。


推荐阅读