我有一张表,上面有下列数据
id|task1_name|task1_date|task2_name|task2_date
1,breakfast,1/1/20,,
2,null,null,breakfast,,1/1/20
3,null,null,lunch,,1/1/20
4,dinner,1/1/20,lunch,1/1/10
我想构建一个视图,它总是在同一列中显示任务名称,如果在任何列中都找不到任务名称,则为null。
id|dinner_date|lunch_date|breakfast_date
1,1/1/20, null, null
2,null, null, 1/1/20
2,1/1/20, 1/1/10, null
我试过使用嵌套的if语句。
SELECT *
IF(task_1_name = 'dinner', task1_date, IF(task2_date = 'dinner', task2_date, NULL)) as `dinner_date`
FROM t
但由于实际数据集中有50个左右的列,这似乎是一个愚蠢的解决方案,而且会很快变得复杂,有没有更聪明的方法呢?
3条答案
按热度按时间jgwigjjp1#
一种方法使用
case
表达:dzhpxtsq2#
下面是bigquery标准sql和generic,足以解决问题中表达的问题。您不需要预先知道列数和任务名称(尽管它们不应该有
,
或者:
这在这里不应该是一个很大的限制,如果需要可以解决)注解;这里的假设只是关于列名称
task<N>_name
以及task<N>_date
是否适用于与您的相关样本数据(类似)输出为
gmxoilav3#
下面是另一个解决方案,它不使用动态sql,不依赖于特定的列名,并且可以处理任意数量的列: