背景
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;
希望对大家有帮助。