【问题标题】:BigQuery update an item in repeated field (array)?BigQuery 更新重复字段(数组)中的项目?
【发布时间】:2020-04-08 11:23:22
【问题描述】:

如何更新 BigQuery 中重复字段中的特定项目?

例如,我只想更新匹配评论id = 1 的 cmets,它的 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';

【问题讨论】:

  • 数据中有两个 id。请显示您想要的结果。
  • id是指评论的id

标签: python sql google-bigquery dml


【解决方案1】:

这是查询你想要的方式的方式

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;

注意 ID。 where语句中的id属于数据点,case语句中的id属于应该编辑的评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-10
    • 2019-04-18
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多