BigQuery:使用 UNNEST 检查数组的内容
Posted
技术标签:
【中文标题】BigQuery:使用 UNNEST 检查数组的内容【英文标题】:BigQuery: Checking the content of an array with using UNNEST 【发布时间】:2020-01-13 13:43:39 【问题描述】:过去几个小时我一直在尝试寻找一种方法来检查 BigQuery,如果数组包含某个值而不使用 UNNEST。我不想使用 UNNEST 的原因是我不想要 UNNEST 结果,我只想检查值是否在其中(然后在其上执行条件 CASE WHEN)。
我尝试了不同的方法,例如 value = ANY(array)、CONTAINS、CONTAINS_ARRAY,但它们都不适用于 BigQuery。
谢谢!
【问题讨论】:
你能提供你的表架构吗? 【参考方案1】:如果您不使用 UNNEST 的唯一原因是未嵌套的结果,我不会放弃此选项。虽然,我建议您使用 UNNEST 并且不要选择未嵌套的列。因此,维护您的嵌套结果,您将能够使用这些临时的新列来验证您的 CASE WHEN 语句中的条件。
我在 BigQuery 中使用了public dataset 来为您举例说明此算法。语法为:
WITH
temporary_table AS(
SELECT
*,
param
FROM
`firebase-public-project.analytics_153293282.events_20181003`,
UNNEST(event_params) AS param )
SELECT
*,
CASE
WHEN (param.key IN ('value', 'board')) THEN TRUE
END
AS check
FROM
temporary_table
LIMIT
100;
请注意,来自 event_param 的 未嵌套列 不会显示在最终结果中。此外,列 check 已创建并用作布尔值,可以省略,也可以用作标志以对所需列进行所需的修改。
希望对你有帮助。
【讨论】:
感谢您的帮助,我试过了,但是好像不行,我还在努力寻找解决方案 @Rob,如果您有任何错误,请告知?或者您对结果的期望是什么? 您好,很抱歉回复晚了。我找到了解决方法,而不是试图找到没有取消嵌套的解决方案,而是取消嵌套和过滤。它帮助我得到了我想要的结果。谢谢!【参考方案2】:以下示例适用于 BigQuery 标准 SQL
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id, [1,2,3] arr UNION ALL
SELECT 2, [4,5]
)
SELECT id, arr,
CASE 1 IN UNNEST(arr)
WHEN TRUE THEN 'valie is in array'
ELSE 'valie is not in array'
END conclusion
FROM `project.dataset.table`
结果
如您所见,结果不是未嵌套的!
【讨论】:
感谢您的帮助,我尝试了您的解决方案,但它似乎没有提供我正在寻找的解决方案,如果我能找到解决方案,我会更新 你能说得更具体点吗?!解释不符合预期的情况以及理想情况下您所期望的情况 您好,很抱歉回复晚了。我找到了解决方法,而不是试图找到没有取消嵌套的解决方案,而是取消嵌套和过滤。它帮助我得到了我想要的结果。谢谢!以上是关于BigQuery:使用 UNNEST 检查数组的内容的主要内容,如果未能解决你的问题,请参考以下文章