Sql 基于非嵌套数据和嵌套数据条件的BigQuery嵌套表更新

Sql 基于非嵌套数据和嵌套数据条件的BigQuery嵌套表更新,sql,arrays,nested,google-bigquery,Sql,Arrays,Nested,Google Bigquery,我正在尝试更新bigQuery数据库中的记录,如下所示: 使用以下代码: UPDATE `tottus-chile.espacio.nested_table` SET addresses = ARRAY( SELECT AS STRUCT * REPLACE('sleep' AS address) FROM UNNEST(addresses) ) WHERE first_name="pauli shore" AND EXISTS ( SELECT 1

我正在尝试更新bigQuery数据库中的记录,如下所示:

使用以下代码:

UPDATE `tottus-chile.espacio.nested_table`
SET addresses =
  ARRAY(
    SELECT AS STRUCT * REPLACE('sleep' AS 
       address)
    FROM UNNEST(addresses)
  )
WHERE first_name="pauli shore" AND EXISTS (
  SELECT 1 FROM UNNEST(addresses) AS h 
  WHERE h.status="previous"
)
然而,如图所示,它使所有地址都读为“sleep”,而不仅仅是“前一个”


我必须承认,对于如何最好地处理嵌套表中的更改,我感到非常困惑。是否有一种通用的方法来实现只更新嵌套数组的“上一个”部分?

这就是您想要做的吗

UPDATE `tottus-chile.espacio.nested_table`
    SET addresses =
        ARRAY(SELECT AS STRUCT a.* EXCEPT (address),
                               (CASE WHEN a.status = 'previous' THEN 'sleep' ELSE a.address END) as address
              FROM UNNEST(addresses) a
             )
WHERE first_name = 'pauli shore' AND
      EXISTS (SELECT 1
              FROM UNNEST(addresses) AS h 
              WHERE h.status = 'previous'
             );
这确实会重新排列结构中的列——这可以通过更多的编码来解决。我认为这可能是您想要做的

编辑:

为了避免移位,可以显式列出列:

UPDATE `tottus-chile.espacio.nested_table`
    SET addresses =
        ARRAY(SELECT AS STRUCT a.status,
                               (CASE WHEN a.status = 'previous' THEN 'sleep' ELSE a.address END) as address,
                               a.* EXCEPT (status, address)
              FROM UNNEST(addresses) a
             )
WHERE first_name = 'pauli shore' AND
      EXISTS (SELECT 1
              FROM UNNEST(addresses) AS h 
              WHERE h.status = 'previous'
             );

这只是重建结构,但有条件地重新分配
地址的值

请解释您试图完成的任务。前后数据都会很有帮助。我只尝试使用first_name=“pauli shore”更新记录中以前的地址。“提供的图片显示了当我在一条记录上运行提供的代码时会发生什么,该记录的当前地址和以前的地址是不同的值。编辑工作非常完美。感谢您的快速回复!你介意快速解释一下你的方法吗?