更新BigQuery表中ARRAY中的值

时间:2017-09-19 11:50:17

标签: sql google-bigquery

我有一个BigQuery表,它具有与图中所示类似的模式,可以包含结构数组的行。我应该使用什么语法来尝试将itemDelta.typeId更改/更新为另一个值? (如果不清楚,请参见SQL)

BigQuerySchema

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

2 个答案:

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