在BigQuery中处理结构(struct)成员的类型转换时,有几种有效的方法可以实现这一目标。以下是详细的解决方案:
BigQuery中的结构(struct)是一种复合数据类型,可以包含多个命名字段,每个字段可以有不同的数据类型。有时我们需要转换这些结构成员的数据类型以满足查询或分析需求。
SELECT
struct_field,
CAST(struct_field.member AS INT64) as member_as_int,
SAFE_CAST(struct_field.member AS FLOAT64) as member_as_float
FROM my_table
SAFE_CAST
在转换失败时返回NULL而不是报错。
SELECT
STRUCT(
CAST(struct_field.member1 AS STRING) as member1,
SAFE_CAST(struct_field.member2 AS DATE) as member2,
struct_field.member3 -- 保持不变的部分
) as converted_struct
FROM my_table
SELECT
JSON_EXTRACT_SCALAR(TO_JSON_STRING(struct_field), '$.member') as member_as_string,
CAST(JSON_EXTRACT_SCALAR(TO_JSON_STRING(struct_field), '$.numeric_member') AS INT64) as member_as_int
FROM my_table
SELECT
struct_field,
CASE
WHEN REGEXP_CONTAINS(struct_field.string_member, r'^[0-9]+$')
THEN CAST(struct_field.string_member AS INT64)
ELSE NULL
END as converted_int
FROM my_table
SELECT
STRUCT(
struct_field.id,
CAST(struct_field.nested_struct.member AS TIMESTAMP) as converted_timestamp
) as converted_nested_struct
FROM my_table
SELECT
struct_field,
(
SELECT AS STRUCT
CAST(a.member1 AS STRING) as member1,
SAFE_CAST(a.member2 AS BOOL) as member2,
a.member3
FROM UNNEST([struct_field]) a
) as converted_struct
FROM my_table
当遇到类型转换错误时,可以使用CASE语句或IF表达式进行条件转换:
SELECT
struct_field,
CASE
WHEN SAFE_CAST(struct_field.member AS INT64) IS NOT NULL
THEN SAFE_CAST(struct_field.member AS INT64)
ELSE 0 -- 默认值
END as safe_converted_member
FROM my_table
这些方法提供了在BigQuery中安全有效地转换结构成员类型的灵活解决方案。
没有搜到相关的文章