BigQuery 脚本中的条件逻辑

Posted

技术标签:

【中文标题】BigQuery 脚本中的条件逻辑【英文标题】:Conditional logic in BigQuery scripts 【发布时间】:2020-01-28 23:46:47 【问题描述】:

我正在尝试编写一个 BigQuery 语句/脚本:

    检查 table_a 是否存在 如果table_a存在,则从table_a中选择col_1、col_2、col_3 如果table_a不存在,则从table_b中选择col_1、col_2、col_3

我知道如何做第 1 步:

select count(1) cnt from `project.dataset.__TABLES_SUMMARY__`
WHERE table_id = 'table_a'

感谢这篇文章: BigQuery check if table exists or not

但是,我无法完成剩下的工作。我试过了:

if (select count(1) cnt from `project.dataset.__TABLES_SUMMARY__`
WHERE table_id = 'table_a')=1
select col_1, col_2, col_3 from table_a

也试过了:

if (select count(1) cnt from `project.dataset.__TABLES_SUMMARY__`
WHERE table_id = 'table_a')=1
then 
select col_1, col_2, col_3 from table_a

这两个都失败了。 在标准 SQL 中,选择语句之外的这种条件逻辑是否可行?

(显然在 select 子句中,我可以使用 case 语句,但是当我想根据条件更改要查询的表时,我不知道如何在此处使用它。而且我可以将语句包装在 Python 代码中并将条件放在那里,但我试图避免使用包装器,因为我希望将查询用作 BQ 中的保存视图)。

提前致谢。

【问题讨论】:

【参考方案1】:

以下内容对我有用:

DECLARE table_count int64;

set table_count = (select count(*) from dataset.INFORMATION_SCHEMA.TABLES where table_name = 'table_a');

if table_count >= 1 then (select col_1,col_2,col_3 from dataset.table_a);
else (select col_1,col_2,col_3 from dataset.table_b);
end if;

【讨论】:

谢谢,这似乎可行,尽管它在我运行它时返回两组结果的列表 - “set table_count”的一个无用结果和一个所需的结果。我需要手动单击“查看结果”以获得最终结果,这使得它很难插入任何类型的 ETL 甚至 BQ 视图。抱歉,这可能是个愚蠢的问题 - 你知道如何只返回最终结果,而不需要点击它吗? 我其实不确定;这可能需要一个关于处理 BQ 脚本结果的新问题。要创建视图/表,您可能可以在 if/else 逻辑中添加 CREATE 语句,但我还没有尝试过。

以上是关于BigQuery 脚本中的条件逻辑的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本中的逻辑判断

模块shell脚本逻辑结构

六十八shell脚本中的逻辑判断文件目录属性判断if特殊用法case判断

20.5shell脚本中的逻辑判断20.6文件目录属性判断20.7-9if特殊用法 case判断

shell脚本中的逻辑判断文件目录属性判断if特殊用法case判断

Shell脚本中的逻辑判断文件目录属性判断if的特殊用法case判断