![](/img/trans.png)
[英]SQL - NULL values included in array when using 'IGNORE NULLS'
[英]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.