繁体   English   中英

SQL 数组与 Null

[英]SQL Array with Null

我正在尝试使用这样的数组对 BigQuery 列进行分组:

with test as (
   select 1 as A, 2 as B
   union all
   select 3, null
)

select *,
       [A,B] as grouped_columns
from test

但是,这不起作用,因为 B 列第 2 行中有一个null值。

事实上这也行不通:

select [1, null] as test_array

但是,在阅读 BigQuery 上的文档时,它说应该允许空值。

在 BigQuery 中,数组是由相同数据类型的零个或多个值组成的有序列表。 您可以构造简单数据类型(例如 INT64)和复杂数据类型(例如 STRUCT)的 arrays。 当前的例外是 ARRAY 数据类型:不支持 arrays 中的 arrays。 Arrays 可以包含 NULL 个值。

似乎没有任何属性或安全前缀可与ARRAY()一起使用来处理空值。

那么最好的方法是什么?

根据文档 - 对于数组类型

目前,BigQuery 对于 NULL 和 ARRAYs 有以下两个限制:

  • 如果查询结果有 ARRAYs,其中包含 NULL 个元素,BigQuery 会引发错误,尽管这样的 ARRAYs 可以在查询中使用。

  • BigQuery 在查询结果中将 NULL ARRAY 转换为空 ARRAY,尽管在查询中 NULL 和空 ARRAYs 是两个不同的值。

所以,作为你的例子 - 你可以使用下面的“技巧”

with test as (
   select 1 as A, 2 as B union all
   select 3, null
)
select *, 
  array(select cast(el as int64) el
    from unnest(split(translate(format('%t', t), '()', ''), ', ')) el
    where el != 'NULL'
  ) as grouped_columns
from test t  

以上给出以下 output

在此处输入图像描述

注意:上述方法不需要显式引用所有涉及的列!

我目前的解决方案——我不喜欢它——是使用 IFNULL()、UNNEST() 和 ARRAY() 的组合,如下所示:

select 
       *,
       array(
           select * 
           from unnest(
               [
                   ifnull(A, ''), 
                   ifnull(B, '')
                   ]
               ) as grouping 
           where grouping <> ''
           ) as grouped_columns
from test

另一种方法是,您可以使用 function IFNULL(null, 0)将 NULL 值替换为一些非空数字,如下所示:-

with test as (
   select 1 as A, 2 as B
   union all
   select 3, IFNULL(null, 0)
)

select *,
       [A,B] as grouped_columns
from test

暂无
暂无

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

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