有没有办法通过数组的内容过滤 BigQuery 中的行?

Posted

技术标签:

【中文标题】有没有办法通过数组的内容过滤 BigQuery 中的行?【英文标题】:Is there a way to filter rows in BigQuery by the contents of an array? 【发布时间】:2021-02-12 13:42:09 【问题描述】:

我在 BigQuery 表中有如下所示的数据:

[
     "id": 1, "labels": ["key": "a", "value": 1, "key": "b", "value": 2] ,
     "id": 2, "labels": ["key": "a", "value": 1, "key": "b", "value": 3] ,
    // a lot more rows
]

我的问题是,如何找到"key" = "a""value" = 1 以及"key" = "b""value" = 3 所在的所有行?

我已经尝试过各种形式的使用UNNEST,但我一直无法正确使用。 CROSS JOIN 让我为 labels 数组中的每个对象保留一行,这让我无法同时查询它们。

【问题讨论】:

【参考方案1】:

试试这个:

select *
from mytable
where exists (select 1 from unnest(labels) where key = "a" and value=1)
  and exists (select 1 from unnest(labels) where key = "b" and value=3)

【讨论】:

【参考方案2】:

假设标签数组中没有重复的条目 - 您可以在下面使用

select *
from `project.dataset.table` t
where 2 = (
  select count(1) 
  from t.labels kv 
  where kv in (('a', 1), ('b', 3))
)

【讨论】:

【参考方案3】:

您可以尝试解析 JSON,然后您可以根据您的要求对其应用不同的过滤条件,在以下查询中,我尝试确定哪些记录具有 Key=a 然后我尝试确定哪个记录具有 value=30 然后通过id 加入他们:-

WITH data1 AS (
SELECT ' "id": 1, "labels": ["key": "a", "value": 11, "key": "b", "value": 22] ' as c1
union all
SELECT ' "id": 2, "labels": ["key": "a", "value": 10, "key": "b", "value": 30] ' AS C1
) 
select T1.id, T1.C1, T1.key, T2.value from 
(SELECT JSON_EXTRACT_SCALAR(c1 , "$.id") AS id, 
json_extract_scalar(curSection, '$.value') as value, json_extract_scalar(curSection, '$.key') as key,
        c1 
 FROM data1 tbl LEFT JOIN unnest(json_extract_array(tbl.c1, '$.labels') 
             ) curSection 
where json_extract_scalar(curSection, '$.key')='a') T1,
(
SELECT JSON_EXTRACT_SCALAR(c1 , "$.id") AS id, 
json_extract_scalar(curSection, '$.value') as value, json_extract_scalar(curSection, '$.key') as key,
        c1 
 FROM data1 tbl LEFT JOIN unnest(json_extract_array(tbl.c1, '$.labels') 
             ) curSection 
where json_extract_scalar(curSection, '$.value')='30') T2
where T1.id = T2.id

希望它对你有用。

【讨论】:

以上是关于有没有办法通过数组的内容过滤 BigQuery 中的行?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法使用预编译的 sql 完成工作并通过 java api (bigquery) 多次运行

有没有办法在 bigquery 中使用动态数据集名称

在 BigQuery 中,有没有办法增加一个阶段的输出接收器数量?

BigQuery - 分组并使用数组字段作为过滤器

有没有办法将参数传递给 google bigquery 以在其“IN”函数中使用

有没有办法在 BigQuery 表上创建自定义日分区?