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 中 Array_contains 的类似功能。我正在尝试获取 Array of Struct 字段中存在的多个值的结果