Google bigquery 基于另一列中的值更新BigQuery中的嵌套数组

Google bigquery 基于另一列中的值更新BigQuery中的嵌套数组,google-bigquery,Google Bigquery,我对BigQuery语法有一个问题,我有点被卡住了。我在一个表中有一个条目,它有多个键值对作为一个数组,当键值是某个值时,我只想更新值中的一个特定字符串 这是条目 [ { "event_params": [ { "key": "programType", "value": { "string_value": "custom", "int_value": null, "float_v

我对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”覆盖字符串值“overwrite\u me”时。一般来说,字符串_值是任意字符串,我只想用相同的值覆盖它

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


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

下面是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 
)
另外,请注意-您可以删除对
事件参数的引用,如下例所示

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)  
)

在使用SET方法之前是否声明了数组?另外,您得到了哪些错误?是的,所有数组都已声明。我排除了获取表中所有条目的代码。这些错误是语法错误(如“syntax error:Expected”)”和关键字get as之间的混合,我不太理解为什么语法错误,其他时候(不是上面的代码)我得到“错误:无法访问类型为ARRAYI的值上的字段名。我正在调查此字段名,稍后会与您联系。这让我困惑了几天。我的同事和我想出的一个解决方案是手动重建结构,它可以工作,但它会弄乱列名,这是没有帮助的。对于一个非常类似的相关问题,除了这里我们有键值对,它不是这个解决方案所提供的,我只是不能让它与连接一起工作。我试图用一个具有类似结构的公共数据集来重现它。这就是为什么我要花更长的时间来尝试解决这个问题。我看到了你写的例子,它确实有点不同,我还在研究它,我会让你知道的。啊,太完美了!这正是我要找的。谢谢。
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)  
)