Обновление вложенного массива в BigQuery на основе значения в другом столбце - PullRequest
1 голос
/ 20 января 2020

У меня проблема с синтаксисом BigQuery, на которой я немного застрял. У меня есть запись в таблице, которая содержит несколько пар значений ключа в виде массива, и я хотел бы обновить только одну указанную строку c в значениях, когда ключом является определенное значение.

Вот запись

[
  {
    "event_params": [
      {
        "key": "programType",
        "value": {
          "string_value": "custom",
          "int_value": null,
          "float_value": null,
          "double_value": null
        }
      },
      {
        "key": "firebase_event_origin",
        "value": {
          "string_value": "app",
          "int_value": null,
          "float_value": null,
          "double_value": null
        }
      },
      {
        "key": "firebase_screen_id",
        "value": {
          "string_value": null,
          "int_value": "5",
          "float_value": null,
          "double_value": null
        }
      },
      {
        "key": "programName",
        "value": {
          "string_value": "overwrite_me",
          "int_value": null,
          "float_value": null,
          "double_value": null
        }
      }
    ]
  }
]

, и я хотел бы оставить все как есть, кроме случаев, когда "key" = "programName". Я хочу перезаписать string_value "overwrite_me" новой строкой. «анонимный». В общем случае string_value - это произвольная строка, и я просто хочу перезаписать ее тем же значением.

На основе нескольких ответов здесь и здесь Я пробовал следующий запрос (и различные его варианты)

SET
event_params = ARRAY(
   SELECT AS STRUCT * REPLACE(
     CASE WHEN event_param.key = 'programName' THEN
      ((SELECT AS STRUCT value.* REPLACE('anonymous' AS string_value)) AS value)
    END
  ) 
  FROM UNNEST(event_params) as event_param 
)

, но BigQuqery всегда выдает мне синтаксические ошибки, в частности, «Синтаксическая ошибка: ожидается»), но получает ключевое слово AS в [9:73] ». Я не совсем уверен, что я делаю неправильно, и я совершенно озадачен.

1 Ответ

1 голос
/ 20 января 2020

Ниже для BigQuery Standard SQL

См. Исправленную версию очень вашего кода

SET
event_params = ARRAY(
  SELECT AS STRUCT * REPLACE(
    CASE WHEN event_param.key = 'programName' THEN
      (SELECT AS STRUCT * REPLACE('anonymous' AS string_value) FROM UNNEST([value]))
    ELSE value
   END AS value
  ) 
  FROM UNNEST(event_params) AS event_param 
)

Также обратите внимание - вы можете удалить ссылку на event_param, как в примере ниже

SET
event_params = ARRAY(
  SELECT AS STRUCT * REPLACE(
    CASE WHEN key = 'programName' THEN
      (SELECT AS STRUCT * REPLACE('anonymous' AS string_value) FROM UNNEST([value]))
    ELSE value
   END AS value
  ) 
  FROM UNNEST(event_params)  
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...