clickhouse数据库insert select语句报错Code: 44. DB::Exception: Array(Int32) cannot be inside Nullable column

背景

clickhouse数据库中,如何使用insert select语句将Nullable字段写入非null的字段中报错,Code: 44. DB::Exception: Array(Int32) cannot be inside Nullable column.

原因是源表中字段为Nullable的,插入到Array(Int32) 中,类型不匹配。Array类型只能接收非Nullable字段。

解决方法

对源字段进行Null判断,并设置默认值。
注意,我使用的是23.4.6.25版本的ck,这个版本中,只能使用ifNull函数来进行空值判断,使用if,并在条件中写column is null是无法识别的。
如下:

-- 正确
insert into target_table (ID, ArrayClumn)
select ID, ifNull(from_string, '[]')
from source_table;

-- 错误
insert into target_table (ID, ArrayClumn)
select ID, if(from_string is null, '[]', from_string)
from source_table;

-- 错误
insert into target_table (ID, ArrayClumn)
select ID, if(isNull(from_string), '[]', from_string)
from source_table;

如果你的条件中还包含其他提交,可以包含在ifNull函数里,只要最外层是ifNull即可识别。例如:

-- 正确
insert into target_table (ID, ArrayClumn)
select ID, ifNull(if(from_string = 'null', '[]', from_string), '[]')
from source_table;

-- 错误
insert into target_table (ID, ArrayClumn)
select ID, if(from_string is null or from_string = 'null', '[]', from_string)
from source_table;

希望对大家有帮助。

你可能感兴趣的:(数据库,clickhouse,sql)