在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)
我可以看到相关字段的类型为RECORD
和NULLABLE
,因此我认为可以将其设置为null
。有一个技巧可以使它正常工作吗?
答案 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针对NULL
和ARRAYs
有two following limitations:
ARRAYs
个元素的NULL
,BigQuery会引发错误,尽管此类ARRAYs
可以在查询中使用。NULL ARRAY
转换为查询结果中的空白ARRAY
,尽管在查询NULL
和空白ARRAYs
中是两个不同的值。