大查询更新结构在重复字段中为null

时间:2018-12-17 22:37:59

标签: nested google-bigquery sql-update

在Google bigquery中,我正在尝试对重复字段进行更新。

为进行比较,此方法有效(或至少标记为有效),但是当然实际上并没有更新该字段。

UPDATE my.table t
SET my_field = ARRAY(
  SELECT AS STRUCT g.foo, g.bar, g.struct_to_set_null
  FROM unnest(t.groups) as g
), ... FROM ... etc

struct_to_set_null设置为null会产生错误:

UPDATE my.table t
SET my_field = ARRAY(
  SELECT AS STRUCT g.foo, g.bar, null as struct_to_set_null
  FROM unnest(t.groups) as g
), ... FROM ... etc
  

Value of type ARRAY<STRUCT<... (really long and cut off) cannot be assigned to groups, which has type <ARRAY,STRUCT<... (same, really long, cut off)

我可以看到相关字段的类型为RECORDNULLABLE,因此我认为可以将其设置为null。有一个技巧可以使它正常工作吗?

2 个答案:

答案 0 :(得分:1)

问题在于,BigQuery不会仅从NULL文字推断出struct字段的类型;您需要更加明确。这是一个示例:

CREATE TABLE tmp_elliottb.UpdateTable (
  my_field ARRAY<STRUCT<foo INT64, bar INT64, struct_to_set_null STRUCT<x STRING, y BOOL, z INT64>>>
);

UPDATE tmp_elliottb.UpdateTable
SET my_field = ARRAY(
  SELECT AS STRUCT foo, bar, NULL AS struct_to_set_null FROM UNNEST(my_field)
)
WHERE true;

这给了我

Value of type ARRAY<STRUCT<foo INT64, bar INT64, struct_to_set_null INT64>> cannot be assigned to my_field, which has type ARRAY<STRUCT<foo INT64, bar INT64, struct_to_set_null STRUCT<x STRING, y BOOL, z INT64>>> at [4:16]

我可以做的是使用一个生成IF但在其中一个分支上具有NULL的{​​{1}}表达式,以便强制使用我想要的输出类型:< / p>

struct_to_set_null

或者,我也可以使用UPDATE tmp_elliottb.UpdateTable SET my_field = ARRAY( SELECT AS STRUCT foo, bar, IF(false, struct_to_set_null, NULL) AS struct_to_set_null FROM UNNEST(my_field) ) WHERE true;

SELECT * REPLACE

答案 1 :(得分:0)

重复是数组类型,因此不能将其设置为NULL

当前,BigQuery针对NULLARRAYstwo following limitations

  • 如果查询结果中包含ARRAYs个元素的NULL,BigQuery会引发错误,尽管此类ARRAYs可以在查询中使用。
  • BigQuery将NULL ARRAY转换为查询结果中的空白ARRAY,尽管在查询NULL和空白ARRAYs中是两个不同的值。