首页 > 解决方案 > 根据另一列中的值更新 BigQuery 中的嵌套数组

问题描述

我对 BigQuery 语法有一个问题,我有点坚持。我在一个表中有一个条目,它有多个键值对作为数组,当键是某个值时,我想只更新值中的一个特定字符串。

这是条目

[
  {
    "event_params": [
      {
        "key": "programType",
        "value": {
          "string_value": "custom",
          "int_value": null,
          "float_value": null,
          "double_value": null
        }
      },
      {
        "key": "firebase_event_origin",
        "value": {
          "string_value": "app",
          "int_value": null,
          "float_value": null,
          "double_value": null
        }
      },
      {
        "key": "firebase_screen_id",
        "value": {
          "string_value": null,
          "int_value": "5",
          "float_value": null,
          "double_value": null
        }
      },
      {
        "key": "programName",
        "value": {
          "string_value": "overwrite_me",
          "int_value": null,
          "float_value": null,
          "double_value": null
        }
      }
    ]
  }
]

我想保持一切都一样,除非“key”=“programName”我想用新字符串“anonymous”覆盖string_value“overwrite_me”。一般来说, string_value 是一些任意字符串,我只想用相同的值覆盖它。

基于这里这里的一些答案,我尝试了以下查询(以及它的各种排列)

SET
event_params = ARRAY(
   SELECT AS STRUCT * REPLACE(
     CASE WHEN event_param.key = 'programName' THEN
      ((SELECT AS STRUCT value.* REPLACE('anonymous' AS string_value)) AS value)
    END
  ) 
  FROM UNNEST(event_params) as event_param 
)

但 BigQuqery 总是给我语法错误,特别是“语法错误:预期的“)”但在 [9:73] 得到关键字 AS”。我不太确定我做错了什么,我很困惑。

标签: google-bigquery

解决方案


以下是 BigQuery 标准 SQL

请参阅您的代码的更正版本

SET
event_params = ARRAY(
  SELECT AS STRUCT * REPLACE(
    CASE WHEN event_param.key = 'programName' THEN
      (SELECT AS STRUCT * REPLACE('anonymous' AS string_value) FROM UNNEST([value]))
    ELSE value
   END AS value
  ) 
  FROM UNNEST(event_params) AS event_param 
)

另外,请注意 - 您可以删除对event_param以下示例 中的引用

SET
event_params = ARRAY(
  SELECT AS STRUCT * REPLACE(
    CASE WHEN key = 'programName' THEN
      (SELECT AS STRUCT * REPLACE('anonymous' AS string_value) FROM UNNEST([value]))
    ELSE value
   END AS value
  ) 
  FROM UNNEST(event_params)  
)

推荐阅读