Clickhouse提取逗号分隔多IP字段首个IP时Nullable嵌套类型报错如何解决
报错原因
IF函数两个分支返回值类型不匹配:splitByChar返回的Array(String)的元素为不可空String类型,而你原表的ip字段是Nullable(String)类型,ClickHouse做类型推断时无法兼容两种类型,因此抛出嵌套可空类型的错误。
最优解决方案
直接用substringIndex函数实现需求,不需要拆分数组也不需要提前判断是否存在逗号,性能更高也不会出现类型兼容问题:
SELECT substringIndex(ip, ',', 1) AS ip FROM users
substringIndex(字符串, 分隔符, 计数)会返回字符串按指定分隔符分割后,前「计数」个分段拼接的结果。当计数为1时,恰好就是第一个分隔符之前的内容;如果字符串中没有对应分隔符,会直接返回完整的原字符串,完全符合提取首个IP的需求。
兼容原有写法的方案
如果你坚持用拆分数组的逻辑,也可以通过统一两个分支的返回值类型解决报错:
SELECT IF(ip LIKE '%,%', toNullable(arrayElement(splitByChar(',', ip), 1)), ip) AS ip FROM users
该方案性能低于substringIndex的写法,更推荐优先使用前者。
内容的提问来源于stack exchange,提问作者ewcvis
相关产品推荐
相关产品推荐

