BigQuery SPLIT() 忽略空值
BigQuery SPLIT() ignores empty values
似乎 SPLIT() 将空值视为根本不存在,这会产生意想不到的结果。
例如:
SELECT
NTH(3, SPLIT(values, ","))
FROM
(SELECT "a,b,,d,e" as values)
returns "d",而我希望它为 return NULL。您可以看到这对于多行以逗号分隔的文本会有什么问题。人们会期望以下查询为 return NULL 和 "c",但事实并非如此:
SELECT
NTH(3, SPLIT(values, ","))
FROM
(SELECT "a,b,,d,e" as values),
(SELECT "a,,c,d,e" as values)
相反,它 returns "d" 和 "d"。
这种行为是设计使然的吗?可以更改吗?或者是否有更好的方法来完成我正在做的事情?
这是设计使然的行为,它并非特定于 SPLIT 函数,而是一般的 REPEATED 字段。 BigQuery REPEATED 字段不能存储 NULL(与协议缓冲区中的行为相同),因此 SPLIT 所做的任何事情都不能使 NULL 出现在 REPEATED 字段中。
正如 Mosha 所解释的,从 SPLIT() 操作中获取 NULL 是不可能的。作为替代方案,让空格成为一种选择吗?
SELECT
NTH(7, SPLIT(values, ","))
FROM
(SELECT REGEXP_REPLACE(values, ',,', ', ,') values FROM
(SELECT "a,b,,d,e,,g" as values),
(SELECT "a,,c,d,e,f,g" as values),
(SELECT "a,,c,d,e,f,," as values),
(SELECT "a,,c,d,e,f," as values),
)
Row f0_
1 g
2 g
3
4 null
似乎 SPLIT() 将空值视为根本不存在,这会产生意想不到的结果。
例如:
SELECT
NTH(3, SPLIT(values, ","))
FROM
(SELECT "a,b,,d,e" as values)
returns "d",而我希望它为 return NULL。您可以看到这对于多行以逗号分隔的文本会有什么问题。人们会期望以下查询为 return NULL 和 "c",但事实并非如此:
SELECT
NTH(3, SPLIT(values, ","))
FROM
(SELECT "a,b,,d,e" as values),
(SELECT "a,,c,d,e" as values)
相反,它 returns "d" 和 "d"。
这种行为是设计使然的吗?可以更改吗?或者是否有更好的方法来完成我正在做的事情?
这是设计使然的行为,它并非特定于 SPLIT 函数,而是一般的 REPEATED 字段。 BigQuery REPEATED 字段不能存储 NULL(与协议缓冲区中的行为相同),因此 SPLIT 所做的任何事情都不能使 NULL 出现在 REPEATED 字段中。
正如 Mosha 所解释的,从 SPLIT() 操作中获取 NULL 是不可能的。作为替代方案,让空格成为一种选择吗?
SELECT
NTH(7, SPLIT(values, ","))
FROM
(SELECT REGEXP_REPLACE(values, ',,', ', ,') values FROM
(SELECT "a,b,,d,e,,g" as values),
(SELECT "a,,c,d,e,f,g" as values),
(SELECT "a,,c,d,e,f,," as values),
(SELECT "a,,c,d,e,f," as values),
)
Row f0_
1 g
2 g
3
4 null