简体   繁体   English

将结构值转换为大查询中的行

[英]Convert struct values to row in big query

I want to convert values of struct to independent row我想将结构的值转换为独立行

My table looks like我的桌子看起来像

|id | details
| 1 | {d_0:{id:'1_0'},d_1:{id:'1_1'}}
| 2 | {d_0:{id:'2_0'},d_1:{id:'2_1'}}
Expected Result (will be flattening the inner struct here)
| id  |
|'1_0'|
|'1_1'|
|'2_0'|
|'2_1'|

Since IDK how many fields will be there in details is there any way to convert all the individual fields of the struct as independent rows.由于details将有多少个字段,因此有没有办法将结构的所有单个字段转换为独立的行。

The schema for all values in the details.d_0 , details.d_1 ,... will be the same. details.d_0details.d_1 ……中所有值的架构都是相同的。

Any help or pointer to resources is appreciated.感谢任何帮助或指向资源的指针。

You may use this query that iterates array to achieve your desired output:你可以使用这个迭代数组的查询来实现你想要的 output:

Creating table:创建表:

CREATE TABLE `<proj_id>.<dataset>.<table>` as 
WITH data AS (
 SELECT "1" AS id, STRUCT(STRUCT( '1_0' as id) as d_0, STRUCT( '1_1' as id) as d_1) as details,
 union all SELECT "2" AS id, STRUCT(STRUCT( '2_0' as id) as d_0, STRUCT( '2_1' as id) as d_1) as details
),

tier_1 as (
select id,details.*  from data 
)

select * from tier_1

Actual Query:实际查询:

DECLARE i INT64 DEFAULT 0;

DECLARE query_ary ARRAY<STRING> DEFAULT 

  ARRAY(
select concat(column_name,'.id')  from  `<dataset>.INFORMATION_SCHEMA.COLUMNS`
    WHERE
      table_name = <your-table> AND regexp_contains(column_name, r'd\_\d')
  );
CREATE TEMP TABLE result(id STRING);
LOOP
  SET i = i + 1;
  IF i > ARRAY_LENGTH(query_ary) THEN 
    LEAVE; 
  END IF;
  EXECUTE IMMEDIATE '''
   INSERT result
   SELECT ''' || query_ary[ORDINAL(i)] || ''' FROM `<proj_id>.<dataset>.<table>`
  ''';

END LOOP; 

SELECT * FROM result;

Output: Output:

在此处输入图像描述

Consider below approach考虑以下方法

select id from your_table,
unnest(split(translate(format('%t', details), '()', ''), ', ')) id

if applied to sample data in your question as如果应用于您问题中的示例数据

with your_table as (
 select "1" id, struct(struct('1_0' as id) as d_0, struct('1_1' as id) as d_1) details union all 
 select "2", struct(struct('2_0'), struct('2_1')) 
)

output is output 是

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM