BigQuery:从多个嵌套列中选择 * 替换

Lio*_*ior 1 google-bigquery

我正在尝试删除嵌套在多个记录中的字段。在问题之后,我尝试了以下操作(删除具有路径 abd 的列 d)但出现错误:Unrecognized name: b at [6:68]

WITH T AS (
  SELECT * from unnest([struct(struct(struct(10 as c,'test' as d) as b,'field2' as field2) as a)])

)

select * replace ((select as struct a.* replace( (select as struct b.* except (d)) as b)) as a)  from T;
Run Code Online (Sandbox Code Playgroud)

Mik*_*ant 5

根据我在您的问题中的理解-您的原始行如下

STRUCT(STRUCT(STRUCT(10 AS c,'test' AS d) AS b,'field2' AS field2) AS a) original_struct  
Run Code Online (Sandbox Code Playgroud)

你需要让它

STRUCT(STRUCT(STRUCT(10 AS c) AS b,'field2' AS field2) AS a) original_struct 
Run Code Online (Sandbox Code Playgroud)

以下是为此完成的 BigQuery Standard SQL

#standardSQL
WITH t AS (
  SELECT STRUCT(STRUCT(STRUCT(10 AS c,'test' AS d) AS b,'field2' AS field2) AS a) original_struct 
) 
SELECT 
  original_struct,
  (
    SELECT AS STRUCT (
      SELECT AS STRUCT (
        SELECT AS STRUCT * EXCEPT(d) 
        FROM UNNEST([original_struct.a.b]) b
      ) b, 
      original_struct.a.field2
    ) a
  ) new_struct
FROM t
Run Code Online (Sandbox Code Playgroud)

原始结构看起来像

Row original_struct.a.b.c   original_struct.a.b.d   original_struct.a.field2    
1   10                      test                    field2   
Run Code Online (Sandbox Code Playgroud)

新结构是

Row new_struct.a.b.c    new_struct.a.field2  
1   10                  field2   
Run Code Online (Sandbox Code Playgroud)

因此,为了进一步将其应用于您的特定情况 - 请参见下面的示例

#standardSQL
WITH t AS (
  SELECT 1 id, 2 x, 3 y, STRUCT(STRUCT(STRUCT(10 AS c,'test' AS d) AS b,'field2' AS field2) AS a) xyz, 4 v, 5 w 
) 
SELECT * REPLACE (
  (
    SELECT AS STRUCT (
      SELECT AS STRUCT (
        SELECT AS STRUCT * EXCEPT(d) 
        FROM UNNEST([xyz.a.b]) b
      ) b, 
      xyz.a.field2
    ) a
  ) AS xyz)
FROM t
Run Code Online (Sandbox Code Playgroud)