Как я могу обновлять записи на основе условий во вложенных полях?

# #google-bigquery

Вопрос:

У меня есть таблица bigquery со следующей схемой:

 {
  "fields": [
    {
      "name": "products",
      "type": "RECORD",
      "mode": "REPEATED",
      "fields": [
        {
          "name": "name",
          "type": "STRING",
          "mode": "REQUIRED"
        },
        {
          "name": "qty",
          "type": "INTEGER",
          "mode": "REQUIRED"
        },
        {
          "name": "variant_name",
          "type": "STRING",
          "mode": "REQUIRED"
        },
        {
          "name": "order_id",
          "type": "INTEGER",
          "mode": "REQUIRED"
        },
        {
          "name": "test_mode",
          "type": "BOOLEAN",
          "mode": "REQUIRED"
        },
        {
          "name": "amount",
          "type": "FLOAT",
          "mode": "REQUIRED"
        },
        {
          "name": "transaction_reference",
          "type": "STRING",
          "mode": "REQUIRED"
        },
        {
          "name": "id",
          "type": "INTEGER",
          "mode": "REQUIRED"
        },
        {
          "name": "source",
          "type": "STRING",
          "mode": "REQUIRED"
        },
        {
          "name": "currency",
          "type": "STRING",
          "mode": "REQUIRED"
        }
      ]
    },
    {
      "name": "processed_at",
      "type": "TIMESTAMP",
      "mode": "REQUIRED",
      "description": "bq-datetime"
    },
    {
      "name": "inserted_at",
      "type": "TIMESTAMP",
      "mode": "REQUIRED",
      "description": "bq-datetime"
    }
  ]
}
 

Как вы можете видеть, это products поле является вложенным. То, чего я хотел бы достичь, — это условие обновления, подобное следующему:

 UPDATE `dataset.table`
SET processed_at = '2021-04-17T16:07:30.993806'
WHERE processed_at = '1970-01-01T00:00:00' AND products.order_id = 9366054;
 

И всякий раз, когда я пытаюсь это сделать, я получаю следующую ошибку

 Cannot access field order_id on a value with type ARRAY<STRUCT<name STRING, qty INT64, variant_name STRING, ...>> 
 

Я знаю, что для SELECT вещей с той же логикой я могу использовать UNNEST утверждение, к которому я не могу это применить UPDATE .

Ответ №1:

Попробуйте СУЩЕСТВУЕТ:

 WHERE processed_at = '1970-01-01T00:00:00'
  and EXISTS (SELECT *
              FROM UNNEST(products)
              WHERE order_id = 9366054
             );