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 检查数组的内容的主要内容,如果未能解决你的问题,请参考以下文章

Google BigQuery:UNNEST 结构数组和未嵌套项作为结构

BigQuery 中的 Unnest 导致“数组”错误

Bigquery:UNNEST 重复与展平表性能

UNNEST 数组并使用 CASE WHEN 分配给新列

在 BIGQUERY 上使用 UNNEST 左连接

Unnest 2 级别 - Big Query 数组