Sql 基于非嵌套数据和嵌套数据条件的BigQuery嵌套表更新
我正在尝试更新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
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”更新记录中以前的地址。“提供的图片显示了当我在一条记录上运行提供的代码时会发生什么,该记录的当前地址和以前的地址是不同的值。编辑工作非常完美。感谢您的快速回复!你介意快速解释一下你的方法吗?