Sql BigQuery如何管理SELECT中的结构字段

Sql BigQuery如何管理SELECT中的结构字段,sql,struct,google-bigquery,Sql,Struct,Google Bigquery,以下内容从公共数据源查询结构: SELECT year FROM `bigquery-public-data.words.eng_gb_1gram` LIMIT 1000 其模式为: 结果集是: 似乎BigQuery在访问时会自动将结构转换为其所有(叶)字段,对吗?或者BigQuery如何处理在select语句中直接调用结构的问题?有两件事正在进行。您有一个结构数组(也称为“记录”) 数组的每个元素都显示在结果集中的单独一行上 结构中的每个字段都是一个单独的列 因此,您的结果不是针对一

以下内容从公共数据源查询结构:

SELECT year FROM `bigquery-public-data.words.eng_gb_1gram` LIMIT 1000
其模式为:

结果集是:


似乎BigQuery在访问时会自动将结构转换为其所有(叶)字段,对吗?或者BigQuery如何处理在select语句中直接调用结构的问题?

有两件事正在进行。您有一个结构数组(也称为“记录”)

  • 数组的每个元素都显示在结果集中的单独一行上
  • 结构中的每个字段都是一个单独的列
因此,您的结果不是针对一个结构,而是针对一个结构数组

您可以使用以下命令查看单个结构的情况:

select year[safe_ordinal(1)]
from . . .
您将为数据中的每一行获得一行,该行中包含
数组的第一个元素。它将有单独的列,名称为
year.year
year.term\u frequency
等等。如果希望将这些列作为“常规”列,可以使用:

select year[ordinal(1)].*
from . . .

然后列是年份、术语频率等等。您有一个结构数组(也称为“记录”)

  • 数组的每个元素都显示在结果集中的单独一行上
  • 结构中的每个字段都是一个单独的列
因此,您的结果不是针对一个结构,而是针对一个结构数组

您可以使用以下命令查看单个结构的情况:

select year[safe_ordinal(1)]
from . . .
您将为数据中的每一行获得一行,该行中包含
数组的第一个元素。它将有单独的列,名称为
year.year
year.term\u frequency
等等。如果希望将这些列作为“常规”列,可以使用:

select year[ordinal(1)].*
from . . .

然后,列是
year
term\u frequency
,等等。

您可能知道-记录可以为空-在这种情况下,它是一个结构,记录可以重复-在这种情况下,它是一个记录数组

您可以在结构中使用点开始概念来选择它的所有字段,就像您在表的单个行中使用
select*FROM tbl
或其等效的
select t.*FROM tbl t

例如,下面的代码

with tbl as (
select struct(1 as a, 2 as b, 3 as c) as col_struct, 
  [ struct(11 as x, 12 as y, 13 as z),
    struct(21, 22, 23),
    struct(31, 32, 33)
  ] as col_array
)
select col_struct.* 
from tbl     
产生

就像那些是名为
col\u struct

相同的点星概念-不适用于数组-如果您想单独输出数组元素-您需要首先取消对该数组的测试。就像下面的例子

with tbl as (
select struct(1 as a, 2 as b, 3 as c) as col_struct, 
  [ struct(11 as x, 12 as y, 13 as z),
    struct(21, 22, 23),
    struct(31, 32, 33)
  ] as col_array
)
select rec
from tbl, unnest(col_array) rec    
哪个输出

现在,因为每一行都是一个结构,所以可以使用点星概念

select rec.*
from tbl, unnest(col_array) rec
有输出

最后,您可以将上述内容组合为

select col_struct.*, rec.*
from tbl t, t.col_array rec
有输出

注意:
from tbl t,t.col\u array rec
是从tbl,unest(col\u array)rec

还有一个注意事项——如果您引用在模式的多个位置使用的字段名,那么引擎将选择最外部的匹配字段。如果这个匹配的数组碰巧在数组中,那么首先需要取消对该数组的测试。如果这是STRUCT的一部分,则需要确保完全限定路径

例如,使用上述简化数据

select a from tbl  // will not work    

select col_struct.a from tbl  // will work   

select col_array.x from tbl  // will not work      

select x from tbl, unnest(col_array)  // will work    

基于您的用例,可以对主题进行更多的描述-但上面是一些有希望的有用基础知识,您可能知道-记录可以为空-在这种情况下,它是一个结构,记录可以重复-在这种情况下,它是一个记录数组

您可以在结构中使用点开始概念来选择它的所有字段,就像您在表的单个行中使用
select*FROM tbl
或其等效的
select t.*FROM tbl t

例如,下面的代码

with tbl as (
select struct(1 as a, 2 as b, 3 as c) as col_struct, 
  [ struct(11 as x, 12 as y, 13 as z),
    struct(21, 22, 23),
    struct(31, 32, 33)
  ] as col_array
)
select col_struct.* 
from tbl     
产生

就像那些是名为
col\u struct

相同的点星概念-不适用于数组-如果您想单独输出数组元素-您需要首先取消对该数组的测试。就像下面的例子

with tbl as (
select struct(1 as a, 2 as b, 3 as c) as col_struct, 
  [ struct(11 as x, 12 as y, 13 as z),
    struct(21, 22, 23),
    struct(31, 32, 33)
  ] as col_array
)
select rec
from tbl, unnest(col_array) rec    
哪个输出

现在,因为每一行都是一个结构,所以可以使用点星概念

select rec.*
from tbl, unnest(col_array) rec
有输出

最后,您可以将上述内容组合为

select col_struct.*, rec.*
from tbl t, t.col_array rec
有输出

注意:
from tbl t,t.col\u array rec
是从tbl,unest(col\u array)rec

还有一个注意事项——如果您引用在模式的多个位置使用的字段名,那么引擎将选择最外部的匹配字段。如果这个匹配的数组碰巧在数组中,那么首先需要取消对该数组的测试。如果这是STRUCT的一部分,则需要确保完全限定路径

例如,使用上述简化数据

select a from tbl  // will not work    

select col_struct.a from tbl  // will work   

select col_array.x from tbl  // will not work      

select x from tbl, unnest(col_array)  // will work    

根据您的具体用例,关于主题还有很多可以说的-但以上是一些希望有用的基础知识

您似乎遗漏了yout comment中的一些行。您似乎遗漏了yout comment中的一些行。我明白了,但忽略了数组项,在select表达式中使用
year
是否与
year.*
?@David542<代码>年份。*在您的情况下不起作用,因为
year
是一个数组。如果它只是一个结构,那么
year
将返回一个带有列的“嵌套”结构,
year.
将字段作为单独的列返回。它似乎删除了外部结构名称空间,但在其他方面对非嵌套结构的作用相同:
使用tbl作为(选择struct(12345作为street,struct('Bloom'作为名称,90025作为邮政编码)作为城市,'USA'作为国家)作为地址)选择address.*,tbl中的address
是否准确?如果使用
address.*
,则会发生这种情况。如果只使用
address
,则会在名称中获得
address.
。我知道,但忽略数组项,在选择表达式中使用
year
是否与
year.
做相同的事情?@David542。.
year.*
在您的情况下不起作用,因为
year
是一个数组