我有一个BigQuery表,它具有与图中所示类似的模式,可以包含结构数组的行。我应该使用什么语法来尝试将itemDelta.typeId更改/更新为另一个值? (如果不清楚,请参见SQL)
UPDATE itemInformation
SET itemDelta.typeId = 9426
WHERE itemDelta.typeId = 2424;
更新:
我找到的一项工作是实现用户定义的功能。 BigQuery允许您使用JavaScript创建自定义函数。
以下是代码:
CREATE TEMPORARY FUNCTION edit(table ARRAY<STRUCT<typeId INT64, amount INT64>>)
RETURNS ARRAY<STRUCT<typeId INT64, amount INT64>>
LANGUAGE js AS """
var i;
for(i = 0; i < table.length; i++)
{
if(table[i].typeId == 2452)
{
table[i].typeId = 1000
}
}
return table;
""";
UPDATE itemInformation
SET itemDelta = edit(itemDelta)
where true
答案 0 :(得分:1)
试试这个:
UPDATE itemInformation
SET itemDelta = ARRAY(SELECT AS STRUCT * REPLACE(9426 AS typeId) FROM UNNEST(itemDelta))
WHERE 2424 IN (SELECT typeId FROM UNNEST(itemDelta));
过滤器不是必需的,但它可能会使查询稍微加快,因为它不会修改typeId
在数组中具有不同值的行。
答案 1 :(得分:0)
#standardSQL
UPDATE `yourProject.yourTable.itemInformation`
SET itemDelta = ARRAY(
SELECT STRUCT<typeId INT64, amount INT64>(IF(typeId = 2424, 9426, typeId), amount)
FROM UNNEST(itemDelta)
)
WHERE 2424 IN (SELECT typeId FROM UNNEST(itemDelta))