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