更新 BigQuery 表中的嵌套字段或结构的正确方法。
SQL语句:
UPDATE myTable
SET Employee.name = 'some string'
WHERE id = 10
这是我的代码:
ctx := context.Background()
client, err := bigquery.NewClient(ctx, projectID)
if err != nil {
return fmt.Errorf("bigquery.NewClient: %v", err)
}
defer client.Close()
q := client.Query("UPDATE myTable SET Employee.name = 'some string' WHERE id = @id ")
q.Parameters = []bigquery.QueryParameter{
{
Name: "id",
Value: 10
},
}
job, err := q.Run(ctx)
if err != nil {
return err
}
status, err := job.Wait(ctx)
if err != nil {
return err
}
if err := status.Err(); err != nil {
return err
}
如何更新此结构或嵌套字段?
不幸的是,BigQuery 不支持更新查询的单独字段或嵌套字段。不支持以下语法:
UPDATE myTable
SET Employee.name = 'some string'
WHERE id = 10
我们只能更新整个结构:
UPDATE myTable
SET Employee = STRUCT('aaa', 'bbb')
WHERE id = 10
MERGE 语句在 BigQuery 中非常强大,您可以用它执行许多操作,包括 UPDATE 任何行的任何字段。
试试下面这个
merge into `myTable` as dest
using (
SELECT
* EXCEPT(Employee),
STRUCT(
name = 'some string',
salary = Employee.salary,
position = Employee.position
) AS Employee
FROM `myTable`
WHERE id = @id
) AS source
ON source.id = dest.id
WHEN MATCHED THEN UPDATE SET
col_1 = source.col_1, col_2 = source.col_2 ...
我对此答案有一个后续问题。如果员工是一个结构数组,并且我需要更新其中一条记录,但保持其他记录不变,该怎么办? 即
[STRUCT(
salary = Employee.salary,
position = Employee.position
effective_date = today()),
STRUCT(
salary = empty,
position = Employee.position
effective_date = empty
)]
谢谢你