代码之家  ›  专栏  ›  技术社区  ›  Checo R photo_tom

Bigquery:附加到嵌套记录

  •  1
  • Checo R photo_tom  · 技术社区  · 6 年前

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

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

    然后我插入一个联系无名氏的电话号码。

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

    有没有一个选项,以后添加另一个号码的联系?要得到这样的东西:

    Append example

    2 回复  |  直到 6 年前
        1
  •  3
  •   Elliott Brossard    6 年前

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

    UPDATE socialdata.phones_examples
    SET phone = ARRAY_CONCAT(phone, [("555555", "Home")])
    WHERE name = "Jonh Doe"
    
        2
  •  3
  •   Mikhail Berlyant    6 年前

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

    #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