You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 00:01:06