ClickHouse如何将JSON字符串null值解析为Nullable(Int64)类型NULL
问题原因
JSONExtractInt 是固定返回非空Int64类型的解析函数,按照设计逻辑,遇到JSON null、目标字段不存在、值类型不匹配的场景时,会直接返回Int64类型的默认值0,因此无法区分JSON中真实的0值和null值。
原解析语句JSONExtractInt(text_json)未指定待提取的字段路径column,本身写法存在问题,即使JSON根节点为整数类型,省略路径参数也会导致解析结果不符合预期。
解决方案
方法1:使用支持可空类型返回的通用JSONExtract函数(推荐)
直接使用通用JSONExtract函数,显式指定返回类型为Nullable(Int64),函数会自动将JSON中的null值映射为ClickHouse的NULL,数字值正常解析为Int64,不会出现歧义。
改写后的插入语句如下:
INSERT INTO test.destination (column) SELECT JSONExtract(text_json, 'column', 'Nullable(Int64)') FROM test.source;
方法2:先判断值类型再做分支解析
如果需要自定义类型不匹配时的处理逻辑,可以先用JSONType函数判断目标字段的类型,遇到Null类型直接返回NULL,其余场景再用JSONExtractInt解析整数值:
INSERT INTO test.destination (column) SELECT CASE WHEN JSONType(text_json, 'column') = 'Null' THEN NULL ELSE JSONExtractInt(text_json, 'column') END FROM test.source;
注意事项
- 所有带固定类型后缀的
JSONExtract*函数(包括JSONExtractInt/JSONExtractString/JSONExtractFloat等)返回值均为非可空类型,遇到异常值会返回对应类型的默认值,不适合需要区分null和默认值的场景。 - 解析多层嵌套JSON的可空字段时,只需要在
JSONExtract中按顺序传入多层路径即可,例如解析{"a": {"b": null}}中的b字段,写法为JSONExtract(text_json, 'a', 'b', 'Nullable(Int64)')。
内容的提问来源于stack exchange,提问作者techkuz
相关产品推荐
相关产品推荐

