在中,我试图对重复字段进行更新。
作为比较,这是有效的(或者至少被标记为有效),但当然并不是实际更新字段。
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)
我可以看到,所讨论的字段是RECORD
和NULLABLE
类型的,因此我认为允许将其设置为null
。有什么办法能让这件事奏效吗?
发布于 2018-12-18 17:23:09
问题是,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
表达式,但是在其中一个分支上有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
UPDATE tmp_elliottb.UpdateTable
SET my_field = ARRAY(
SELECT AS STRUCT * REPLACE (IF(false, struct_to_set_null, NULL) AS struct_to_set_null )
FROM UNNEST(my_field)
)
WHERE true;
发布于 2018-12-18 07:39:05
重复是数组类型,因此不能将其设置为NULL
。
目前,BigQuery在NULL
和ARRAYs
方面拥有以下两个限制。
ARRAYs
,则ARRAYs
会引发错误,尽管这种ARRAYs
可以在查询中使用。NULL ARRAY
转换为空ARRAY
,尽管在查询NULL
和空ARRAYs
中有两个不同的值。https://stackoverflow.com/questions/53823992
复制相似问题