在 clickhouse 中,使用强制转换函数时如何为可为空的列返回 null

Posted

技术标签:

【中文标题】在 clickhouse 中,使用强制转换函数时如何为可为空的列返回 null【英文标题】:In clickhouse, How to return null for nullable column when using cast function 【发布时间】:2021-09-08 02:10:40 【问题描述】:

假设我有一个名为 x1 的表,其中 c1 列可以为“Int32”为空,我想使用“CAST”函数将其转换为“Int64”。我发现'CAST'函数不支持可空值,所以我必须先使用以下命令转换空值: SELECT CAST(assumeNotNull(c1), 'Int64') 它可以工作,但是对于 NULL 值返回 0,我也不能使用 'nullIf()',因为它会错误地处理零值。

在转换可为空值时如何获取 NULL?

【问题讨论】:

【参考方案1】:
select arrayJoin( [Null::Nullable(Int32), 42::Nullable(Int32)] ) x, 
cast(x, 'Nullable(Int64)') r, 
toInt64(x) r1 ;
┌────x─┬────r─┬───r1─┐
│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │
│   42 │   42 │   42 │
└──────┴──────┴──────┘

desc(select arrayJoin( [Null::Nullable(Int32), 42::Nullable(Int32)] ) x, 
cast(x, 'Nullable(Int64)') r, 
toInt64(x) r1 );
┌─name─┬─type────────────┬
│ x    │ Nullable(Int32) │
│ r    │ Nullable(Int64) │
│ r1   │ Nullable(Int64) │
└──────┴─────────────────┴

【讨论】:

【参考方案2】:
select arrayJoin( [Null::Nullable(Int32), 42::Nullable(Int32)] ) x, ifNull(x,0)::Int64 r ;
┌────x─┬──r─┐
│ ᴺᵁᴸᴸ │  0 │
│   42 │ 42 │
└──────┴────┘

desc(select arrayJoin( [Null::Nullable(Int32), 42::Nullable(Int32)] ) x, ifNull(x,0)::Int64 r );
┌─name─┬─type────────────┬─
│ x    │ Nullable(Int32) │
│ r    │ Int64           │
└──────┴─────────────────┴─

【讨论】:

以上是关于在 clickhouse 中,使用强制转换函数时如何为可为空的列返回 null的主要内容,如果未能解决你的问题,请参考以下文章

Clickhouse 类型转换函数实战总结

列式数据库~clickhouse

clickhouse日期函数

clickhouse日期函数

clickhouse日期函数

使用带有自动模式检索的 LoadJobs 时如何处理 Avro 到 BigQuery 的类型转换