bigquery 查询第一个可用列

Posted

技术标签:

【中文标题】bigquery 查询第一个可用列【英文标题】:bigquery query first available column 【发布时间】:2016-07-05 23:11:17 【问题描述】:

这与这里的主题类似:BigQuery IF field exists THEN

但是,我们只从一个表中查询,因此该表将只有 A 列或 B 列。我们发现如果您查询 2 个表,其中一个具有 A 列,另一个具有 B 列,那么下面的函数会工作, 但是对于我们的用例,我们只想查询一个表,我们不知道哪一列存在或包含数据。我们要查询存在并包含数据的第一列。

            --This query works
            SELECT user_id,COALESCE(devices.A, B)
            FROM mytable1,
            mytable2
            limit 100

            -- This query does not work
            SELECT user_id,COALESCE(devices.A, B)
            FROM mytable1
            limit 100

我们得到的错误信息是 查询失败 错误:在表“mytable1”中找不到字段“devices.A”;您的意思是“devices.fieldthatexists”吗?

【问题讨论】:

【参考方案1】:

以下是快速解决方法的方向

-- This query does not work
SELECT user_id,COALESCE(A, B)
FROM (
  SELECT 1 AS user_id, 1 AS C
) AS mytable1
LIMIT 100

错误信息是Error: Field 'A' not found; did you mean 'C'?

-- This query will work
SELECT user_id,COALESCE(A, B)
FROM (
  SELECT 1 AS user_id, 1 AS C
) AS mytable1,
(SELECT 1 AS A, 2 AS B) AS faketable
WHERE user_id IS NOT NULL
LIMIT 100

解决方法的想法是只提供一个假表,以“补偿”丢失的字段,然后在 WHERE 子句中消除这个相应的假行

希望对你有帮助

【讨论】:

感谢您的工作!这是否意味着没有其他可能的方法?我在这里的查询是实际查询的简化版本,它包含超过 100 行生产代码,如果有更简洁的方法来完成这项工作,那就太好了。 我认为引用不存在的列会引发错误。因此,您需要以某种方式“伪造”系统以认为它们是架构的一部分。我的答案中的解决方法就是这样做的。基于您的简化示例和现实生活用例的有限曝光 - 这是我能想到的最好的。但您可以等待其他回复

以上是关于bigquery 查询第一个可用列的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 数据可用性

Java基础------杨辉三角(递归实现)

第 1 列第 2 行的错误:文档末尾的额外内容

如何使用 Google Analytics 数据在 Bigquery 中获取可用的日期时间字段

BigQuery 流式插入数据可用性延迟

如何在 BigQuery 中最小化每次 SQL 查询执行的成本