在 Bigquery 中使用 where 条件更新嵌套记录

Posted

技术标签:

【中文标题】在 Bigquery 中使用 where 条件更新嵌套记录【英文标题】:Update nested record with where condition in Bigquery 【发布时间】:2020-07-27 13:23:25 【问题描述】:

我有一个 bigquery 表“metrics”,其中包含嵌套记录字段其中一个字段称为 resource.labels,其键对值如下所示

我需要更新resource.labels,它是一个重复的记录字段,并且在这种情况下有一个键值对resource.labels.key和resource.labels.value

where key="machinetype" and value="N/A" set value="g1.small"

我试过了

update `metrics` set resource.labels.value=ARRAY(SELECT AS STRUCT * REPLACE("g1.small" as value) from UNNEST(resource.labels) as h where h.key="machinetype" and h.value="N/A") where resource.labels.key="machinetype" and resource.labels.value="N/A"

但是给出了这个错误:

Cannot access field key on a value with type ARRAY<STRUCT<key STRING, value STRING>> at [1:241]

谁能给点建议?谢谢。

【问题讨论】:

【参考方案1】:

试试下面 - 应该可以工作

UPDATE `project.dataset.metrics`
SET resource = (
    SELECT AS STRUCT * REPLACE(
      ARRAY(
        SELECT AS STRUCT key, 
          IF(key='machinetype' and value='N/A', 'g1.small', value) as value
        FROM t.labels
      ) AS labels)
    FROM UNNEST([resource]) t
  )
WHERE true

【讨论】:

很好的答案,直到昨天我还在想如何只更新那些特定的行,但这个解决方案更好

以上是关于在 Bigquery 中使用 where 条件更新嵌套记录的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery - 具有不同 WHERE 参数的嵌套查询?

在update语句中使用where子句的目的是啥?

如何根据某些过滤条件从 bigquery 导出数据

Laravel 在使用 where 条件和更新时提供不同的结果

如何使用条件(where子句)更新实体并在spring数据jpa中的方法响应中获取更新的实体

无法识别的名称:在 BigQuery 中使用 UNNEST WHERE 时