Bigquery:附加到嵌套记录

时间:2018-10-09 21:17:11

标签: sql google-bigquery

我目前正在检查Bigquery,我想知道是否有可能将新数据添加到嵌套表中。

例如,如果我有一个这样的表:

[
    {
        "name": "name",
        "type": "STRING"
    },
    {
        "name": "phone",
        "type": "RECORD",
        "mode": "REPEATED",
        "fields": [
            {
                "name": "number",
                "type": "STRING"
            },
            {
                "name": "type",
                "type": "STRING"
            }
        ]
    }
]

然后我为联系人John Doe插入一个电话号码。

INSERT into socialdata.phones_examples (name, phone) VALUES("Jonh Doe", [("555555", "Home")]);

是否可以选择在以后向联系人添加另一个号码?要获得这样的东西:

Append example

我知道我可以更新整个字段,但是我想知道是否有办法将新值附加到嵌套表中。

2 个答案:

答案 0 :(得分:2)

如果您需要为某些用户更新多个记录-您可以在下面使用

#standardSQL
UPDATE `socialdata.phones_examples` t
SET phone = ARRAY_CONCAT(phone, [new_phone]) 
FROM (
  SELECT 'John Doe' name, STRUCT<number STRING, type STRING>('123-456-7892', 'work') new_phone UNION ALL
  SELECT 'Abc Xyz' , STRUCT('123-456-7893', 'work') new_phone 
) u
WHERE t.name = u.name   

或如果某些更新在某些表中可用(例如socialdata.phones_updates):

#standardSQL
UPDATE `socialdata.phones_examples` t
SET phone = ARRAY_CONCAT(phone, [new_phone]) 
FROM `socialdata.phones_updates` u
WHERE t.name = u.name   

答案 1 :(得分:1)

将数据插入BigQuery时,粒度是行的级别,而不是行中包含的数组元素。您可能想使用这样的查询,在其中更新相关行并追加到数组:

UPDATE socialdata.phones_examples
SET phone = ARRAY_CONCAT(phone, [("555555", "Home")])
WHERE name = "Jonh Doe"