Bigquery 如果字段存在

Posted

技术标签:

【中文标题】Bigquery 如果字段存在【英文标题】:Bigquery If field exists 【发布时间】:2016-10-17 21:56:21 【问题描述】:

短:有没有办法在不存在的 BQ 字段中查询,接收这些字段的空值?

我有几乎相同的问题 BigQuery IF field exists THEN 但有时我的 API 可以在没有某些特定字段(历史表)的情况下查询表,这种方法会失败,因为它需要一个包含该字段的表:

SELECT a, b, c, COALESCE(my_field, 0) as my_field
FROM
(SELECT * FROM <somewhere w/o my_field>),
(SELECT * FROM <somewhere with my_field>)

有没有办法做类似的事情:

SELECT IFEXISTS(a, NULL) as the-field
FROM <somewhere w/o my_field>

【问题讨论】:

【参考方案1】:

假设您的表格只有 x 和 y 字段! 所以下面的查询将完美地工作

SELECT x, y FROM YourTable

但低于一个会因为不存在字段 z 而失败

SELECT x, y, z FROM YourTable

解决方法如下

#legacySQL
SELECT x, y, COALESCE(z, 0) as z
FROM 
(SELECT * FROM YourTable),
(SELECT true AS fake, NULL as z)
WHERE fake IS NULL

编辑:添加明确的#legacySQL 以免混淆那些试图将这种精确方法应用于标准 SQL 的人:o)

【讨论】:

有谁知道为什么会这样?但是感谢你的技巧,我们正是需要这个! @Mikhail 如果该列存在,然后我应用您的上述查询,它会说“列名不明确”。有什么建议吗? @phaigeim - 随时发布您的具体问题以及所有详细信息 - 我们将能够回答【参考方案2】:

像 @phaigeim 一样,我无法在 2019 年使用 Mikhail 的答案 - 我得到“列名 z 不明确”。

我最后使用BigQuery Information Schema 表检查该列是否存在,否则使用SELECT NULL as z。我在dbt 中使用 jinja 宏做到了这一点,因为我想不出用直接 SQL 来做到这一点的方法。这限制了它的适用性,但在某些用例中它可能是一种选择。

【讨论】:

仅供参考!在那个答案的时候(2016 年)——BigQuery 标准 SQL 在 GA 中只存在了大约 2 周——因此给出了旧版 SQL 的答案! 你能举个例子吗? 如果你能分享你的 dbt 宏就太好了!【参考方案3】:

这可以通过使用脚本来完成:

DECLARE my_field STRING;
SET my_field  = "default";
-- my_field falls back to "default" if there is no such column in my_table
SELECT my_field FROM my_table;

【讨论】:

当我需要我的脚本同时处理新旧表时,这种方法对我很有效。一个小小的改进是可以直接这样声明默认值:DECLARE my_field STRING DEFAULT "default"; 【参考方案4】:

我最近遇到了这个问题。显然bigquery has exception handling 所以你可以这样做

BEGIN
  SELECT a, b FROM your_table;
EXCEPTION WHEN ERROR THEN
  SELECT a, NULL AS b FROM your_table;
END

假设列a 保证存在,但b 可能不存在。

【讨论】:

以上是关于Bigquery 如果字段存在的主要内容,如果未能解决你的问题,请参考以下文章

bigquery 嵌套对象:没有这样的字段

我想知道 BigQuery 中 Array_contains 的类似功能。我正在尝试获取 Array of Struct 字段中存在的多个值的结果

BigQuery 从日期字段中提取星期作为日期范围

BigQuery:对错误消息感兴趣

如果标准 SQL 不提供 _PARTITIONTIME 字段,我如何在 BigQuery 中查询流缓冲区

如何关联多个 BigQuery 数组字段?