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

In clickhouse, How to return null for nullable column when using cast function

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

如何在转换可为空的值时得到 NULL?

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           │
└──────┴─────────────────┴─
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) │
└──────┴─────────────────┴