BigQuery 嵌套表 UPDATE 基于非嵌套数据和嵌套数据的条件
Posted
技术标签:
【中文标题】BigQuery 嵌套表 UPDATE 基于非嵌套数据和嵌套数据的条件【英文标题】:BigQuery nested table UPDATE based on condition of non-nested data AND nested data 【发布时间】:2019-09-16 01:26:23 【问题描述】:我正在尝试更新如下所示的 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"
)
但是,如图所示,它使所有地址都读为“睡眠”,而不仅仅是“前一个”。
我必须承认,对于如何最好地处理嵌套表中的更改,我感到很困惑。有没有一种通用的方法来实现只更新嵌套数组的“前一个”部分?
【问题讨论】:
请解释您要完成的工作。之前和之后的数据真的很有帮助。 我正在尝试仅使用 first_name = "paulishore" 更新记录中的前一个地址。提供的图片显示了当我在当前地址和以前地址作为不同值的记录上运行提供的代码时会发生什么。 【参考方案1】:这是你想做的吗?
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'
);
这只是重构结构,但有条件地重新分配 address
的值。
【讨论】:
编辑工作完美。谢谢你的快速反应!您介意快速解释一下您的方法吗?以上是关于BigQuery 嵌套表 UPDATE 基于非嵌套数据和嵌套数据的条件的主要内容,如果未能解决你的问题,请参考以下文章
如何从基于嵌套 json 的 BigQuery 表中进行选择?