首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL UNNEST需要别名吗?

SQL UNNEST需要别名吗?
EN

Stack Overflow用户
提问于 2018-10-23 16:14:42
回答 1查看 2.8K关注 0票数 0

我正在学习SQL,并试图理解UNNEST。在具有以下模式的FireBase事件表上:

代码语言:javascript
复制
event_params    RECORD  REPEATED    
event_params. key   STRING  NULLABLE    
event_params. value RECORD  NULLABLE    
event_params.value. string_value    STRING  NULLABLE    
event_params.value. int_value   INTEGER NULLABLE    

这样做是可行的:

代码语言:javascript
复制
SELECT params.key, params.value.string_value, params.value.int_value
FROM `...events_20181021`, 
   UNNEST(event_params) as params

当我跑得更远

代码语言:javascript
复制
SELECT *
FROM `...events_20181021`, 
   UNNEST(event_params)

我看到像event_params.key, event_params.value.string_value, event_params.value.int_value这样的列(在BigQuery中)。但当我尝试

代码语言:javascript
复制
SELECT event_params.key, event_params.value.string_value, event_params.value.int_value
FROM `...events_20181021`, 
   UNNEST(event_params)

那就失败了。为什么?

编辑:参见https://stackoverflow.com/a/51563922/1908650以获得一个不带别名的UNNEST示例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-23 19:59:12

我会尽力解释的

将在CTE下面使用我的示例

代码语言:javascript
复制
WITH `table` AS (
  SELECT 1 id, [STRUCT<key STRING, value STRUCT<string_value STRING, int_value INT64>>('a', ('1',1)),('b', ('2',2)),('c', ('3',3))] params UNION ALL
  SELECT 2, [STRUCT<key STRING, value STRUCT<string_value STRING, int_value INT64>>('x', ('666', 666)),('y', ('777',777))]
)

示例1-简单选择*

代码语言:javascript
复制
#standardSQL
SELECT * 
FROM `table`   

这给出了明显的预期产出。

代码语言:javascript
复制
Row id  params.key  params.value.string_value   params.value.int_value   
1   1   a           1                           1    
        b           2                           2    
        c           3                           3    
2   2   x           666                         666  
        y           777                         777  

例2- UNNEST w/o别名

代码语言:javascript
复制
#standardSQL
SELECT * 
FROM `table`, UNNEST(params)   

结果将是

代码语言:javascript
复制
Row id  params.key  params.value.string_value   params.value.int_value  key value.string_value  value.int_value  
1   1   a           1                           1                       a   1                   1    
        b           2                           2                
        c           3                           3                
2   1   a           1                           1                       b   2                   2    
        b           2                           2                
        c           3                           3                
3   1   a           1                           1                       c   3                   3    
        b           2                           2                
        c           3                           3                
4   2   x           666                         666                     x   666                 666  
        y           777                         777              
5   2   x           666                         666                     y   777                 777  
        y           777                         777              

现在您可以看到两个额外的列,名为keyvalue (值为STRUCT,分别有两个字段,分别为string_value和int_value),它们位于由UNNEST的STRUCT数组获得的各个STRUCT字段名称之后。

重要:以params开头的列实际上是重复记录的一部分,不能直接访问,而那些由UNNEST‘in产生的字段可以直接引用(除非其中一些字段本身是数组,在这种情况下需要第二个UNNEST)

因此,长话短说--我们可以直接将它们称为keyvalue --例如

示例3-引用“继承”字段名

代码语言:javascript
复制
 #standardSQL
SELECT id, key, value 
FROM `table`, UNNEST(params)  

Row id  key value.string_value  value.int_value  
1   1   a   1                   1    
2   1   b   2                   2    
3   1   c   3                   3    
4   2   x   666                 666  
5   2   y   777                 777  

示例4-带有别名的UNNEST

显然,您可以为UNNEST提供别名,以避免潜在的歧义--如果有另一个名为“`key”的字段,那么您希望能够解决这个问题。

代码语言:javascript
复制
#standardSQL
SELECT id AS key, param.key AS param_key, value
FROM `table`, UNNEST(params) param     

结果如

代码语言:javascript
复制
Row key param_key   value.string_value  value.int_value  
1   1   a           1                   1    
2   1   b           2                   2    
3   1   c           3                   3    
4   2   x           666                 666  
5   2   y           777                 777  

希望,以上将帮助你与UNNEST :O友好)

您可以在FROM条款的文档中阅读更多关于FROM条款的内容,然后向下滚动直到UNNEST部分。

示例5-在需要别名的情况下

如果需要使用UNNEST简单数组,如下面的CTE所示,引用扁平元素的唯一方法是使用别名

代码语言:javascript
复制
WITH `project.dataset.table` AS (
  SELECT 1 id, [1,2,3] params UNION ALL
  SELECT 2, [666,777]
)

例如

代码语言:javascript
复制
#standardSQL
SELECT id, param
FROM `project.dataset.table`, UNNEST(params) param
WHERE NOT param IN (2,777)

有结果

代码语言:javascript
复制
Row id  param    
1   1   1    
2   1   3    
3   2   666  
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52953606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档