如何在Bigquery上交换数组列中的两个属性



我有一个包含两列的表:group_id,students(学生数组(。每个学生都有两个属性:name和last_name。如何将每个学生的名字与last_name互换?

Students table:
group_id | students.name | students.last_name
---------------------------------------------
1        | Perez         | Juan
---------------------------------------------
2        | Caicedo       | Pedro

我需要把students.name换成students.last_name,知道吗?

您可以尝试并考虑以下方法。

with a as (
select [struct("Perez" as name,"Juan" as last_name),
struct("Caicedo" as name,"Pedro" as last_name)]as students
)
select stdnts.name last_name, stdnts.last_name name
from a,unnest(students) as stdnts

我们交换了嵌套的列名,而不是属性值。

从这里,根据查询结果,您可以创建另一个具有namelast_name的更新嵌套列名的模式。

或者,如果您的架构太大,并且在BigQuery中重新创建它不是一个选项,您可以覆盖您的表,方法是删除学生数组列表,然后用更新的嵌套列名重新创建它,并且仍然保留基于上述查询的数据。

该方法源自此更改列名文档,但我们将更改嵌套列名。

最后,由于Mikhail Berlyant回答了这个问题(在BigQuery中更新结构数组中的值(,我能够交换Update子句的属性。

UPDATE `Students` s
SET students =  
ARRAY(
SELECT 
AS STRUCT 
last_name, name
FROM s.students
) 
WHERE TRUE;

此外,我还可以用if条件交换update子句的属性。

UPDATE `Students` s
SET students =  
ARRAY(
SELECT 
AS STRUCT 
IF(CONTAINS_SUBSTR(name, 'Pedro'), name, last_name), IF(CONTAINS_SUBSTR(last_name, 'Caicedo'), last_name, name)
FROM s.students
) 
WHERE TRUE;

STRUCT中的位置非常重要,在我的情况下,name是第一位,last_name是第二位,为了实现交换,只需改变其位置就可以达到目的。

最新更新