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 查询第一个可用列的主要内容,如果未能解决你的问题,请参考以下文章