【问题标题】:Updating a value in an ARRAY in a BigQuery table更新 BigQuery 表中 ARRAY 中的值
【发布时间】:2017-09-20 00:02:23
【问题描述】:

我有一个 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

【问题讨论】:

  • 建议 - 如果有办法用纯 SQL 表达相同的逻辑,请不要使用 JS UDF。

标签: sql google-bigquery


【解决方案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 在数组中具有不同值的行。

【讨论】:

  • 感谢您的回复。这似乎并不完全适合我。 BigQuery 抱怨:错误:ARRAY 子查询不能有多个列,除非使用 SELECT AS STRUCT 来构建 STRUCT 值但是,您的查询确实给了我一个想法。 BigQuery 允许您添加自定义 js 函数。我创建了一个函数来处理整个 itemDelta 数组的每一行。它进行必要的更改,然后返回新修改的数组。
  • 糟糕,很抱歉;我需要使用SELECT AS STRUCT。我更新了答案。如果你能提供帮助,我建议不要使用 JavaScript 函数,因为通常你可以简单地使用 SQL 来表达这些类型的转换,这会更快、更便宜(不太可能达到更高的计费等级)。
  • 感谢您的建议。我试试看。
【解决方案2】:
#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)) 

【讨论】:

    猜你喜欢
    • 2021-08-06
    • 1970-01-01
    • 2020-12-09
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多