更新bigquery中的结构体或嵌套字段

问题描述 投票:0回答:3

更新 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
}

我的桌子:

如何更新此结构或嵌套字段?

go google-bigquery
3个回答
1
投票

不幸的是,BigQuery 不支持更新查询的单独字段或嵌套字段。不支持以下语法:

UPDATE myTable
SET Employee.name = 'some string'
WHERE id = 10

我们只能更新整个结构:

UPDATE myTable
SET Employee = STRUCT('aaa', 'bbb')
WHERE id = 10

1
投票

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 ...

0
投票

我对此答案有一个后续问题。如果员工是一个结构数组,并且我需要更新其中一条记录,但保持其他记录不变,该怎么办? 即

  [STRUCT(

    salary = Employee.salary,
    position = Employee.position
    effective_date = today()),
  STRUCT(
    salary = empty,
    position = Employee.position
    effective_date = empty
   )]

谢谢你

© www.soinside.com 2019 - 2024. All rights reserved.