如何在 Bigquery 的数组列中交换两个属性?
How do you swap two attributes in array column on Bigquery?
我有一个包含两列的 table:group_id,学生(学生数组)。每个学生都有两个属性:姓名和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
我们交换了嵌套的列名而不是属性值。
从这里,根据查询结果,您可以创建另一个架构,其中包含 name
和 last_name
的更新嵌套列名。
或者如果您的模式太大并且无法在 BigQuery 中重新创建它,您可以通过删除 students 数组列 [=26] 来覆盖您的 table =] 然后使用更新的嵌套列名重新创建它并仍然保留基于上述查询的数据。
该方法源自此Changing Column Name Documentation,但我们将更改嵌套列名称。
最后,感谢 Mikhail Berlyant 回答了这个问题 (),我能够在更新子句上交换属性。
UPDATE `Students` s
SET students =
ARRAY(
SELECT
AS STRUCT
last_name, name
FROM s.students
)
WHERE TRUE;
此外,我还能够使用 if 条件交换更新子句的属性。
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中的位置非常重要,在我的例子中名字是第一个,last_name是第二个,
为了通过改变其位置来实现交换,objective 已实现。
我有一个包含两列的 table:group_id,学生(学生数组)。每个学生都有两个属性:姓名和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
我们交换了嵌套的列名而不是属性值。
从这里,根据查询结果,您可以创建另一个架构,其中包含 name
和 last_name
的更新嵌套列名。
或者如果您的模式太大并且无法在 BigQuery 中重新创建它,您可以通过删除 students 数组列 [=26] 来覆盖您的 table =] 然后使用更新的嵌套列名重新创建它并仍然保留基于上述查询的数据。
该方法源自此Changing Column Name Documentation,但我们将更改嵌套列名称。
最后,感谢 Mikhail Berlyant 回答了这个问题 (
UPDATE `Students` s
SET students =
ARRAY(
SELECT
AS STRUCT
last_name, name
FROM s.students
)
WHERE TRUE;
此外,我还能够使用 if 条件交换更新子句的属性。
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中的位置非常重要,在我的例子中名字是第一个,last_name是第二个, 为了通过改变其位置来实现交换,objective 已实现。