BigQuery обновить элемент в повторяющемся поле (массив)? - PullRequest
0 голосов
/ 08 апреля 2020

Как обновить указанный элемент c в повторяющемся поле в BigQuery?

Например, я просто хочу обновить комментарии, которые соответствуют комментарию id = 1, каков синтаксис BigQuery SQL для него?

{
  "id": 1,
  "name": "Data A",
  "comments": [
    {
      "timestamp": 1586333435,
      "id": 1,
      "comment": "Hello World"
    },
    {
      "timestamp": 1586333635,
      "id": 2,
      "comment": "Hello World 2"
    }
  ]
}

Мой оператор обновления использует следующее, но он заменяет весь массив.

UPDATE `projectA.dataSetA.Post`
    SET comments = ARRAY(
        SELECT AS STRUCT * REPLACE('Hello World Now' AS comment) FROM UNNEST(comments) AS c WHERE c.id=1)
    WHERE id='1';

1 Ответ

1 голос
/ 09 апреля 2020

Это способ запроса так, как вы хотите

WITH
data AS (
  SELECT 1 as id, 'Data A' as name, 
    [
      STRUCT(1586333435 as timestamp, 1 as id, 'Hello World' as comment),
      STRUCT(1586333635 as timestamp, 2 as id, 'Hello World 2' as comment)
    ] AS comments
)
SELECT id, name, 
  (
    SELECT ARRAY_AGG(STRUCT(timestamp, id, CASE WHEN id = 1 THEN 'Hello World Now' ELSE comment END as comment))
    FROM UNNEST(comments)
  )
FROM data

Таким образом, ваше заявление об обновлении должно выглядеть примерно так:

UPDATE `projectA.dataSetA.Post`
    SET comments = (
      SELECT ARRAY_AGG(STRUCT(timestamp, id, CASE WHEN id = 1 THEN 'Hello World Now' ELSE comment END as comment))
      FROM UNNEST(comments)
    )
    WHERE id=1;

Будьте осторожны с идентификаторами. Идентификатор в операторе where принадлежит точке данных, id в случае, когда инструкция принадлежит комментарию, который должен быть отредактирован.

...