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

Power Query:替换值时如何避免将整数转换为浮点数/小数?

Power Query替换Null后列类型变小数的原因与解决办法

最小工作示例

Power Query M 代码

let
    Source = #table({"col"},{{1},{null}}),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"col", Int64.Type}}),
    #"Replaced Value" = Table.ReplaceValue(#"Changed Type",null,Int64.From(0),Replacer.ReplaceValue,{"col"})
in
    #"Replaced Value"

问题现象

#"Changed Type"步骤里,col列类型是整数(Whole Number);但执行替换Null的步骤后,哪怕用Int64.From(0)当替换值,列类型还是变成了小数(Decimal Number)。

原因

问题出在Replacer.ReplaceValue的类型兼容逻辑上:这个替换器会自动取原列非空值和替换值的"通用兼容类型"。虽然你用了Int64.From(0),但Power Query的类型系统里,当处理含Null的整数列时,会默认把整数类型提升为小数类型——因为小数能兼容更多数值场景,系统怕后续出现类型不兼容的问题,所以自动做了提升。

解决办法

有两种靠谱的方式可以搞定:

方式一:替换后强制转回整数类型

在替换步骤后面加一步类型转换,把列类型重新指定为Int64.Type:

let
    Source = #table({"col"},{{1},{null}}),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"col", Int64.Type}}),
    #"Replaced Value" = Table.ReplaceValue(#"Changed Type",null,Int64.From(0),Replacer.ReplaceValue,{"col"}),
    #"Set Back to Int" = Table.TransformColumnTypes(#"Replaced Value",{{"col", Int64.Type}})
in
    #"Set Back to Int"

方式二:用自定义逻辑替换Null(避免自动类型提升)

不用Replacer.ReplaceValue,改用Table.TransformColumns写自定义替换逻辑,只处理Null值,这样不会触发系统的自动类型提升:

let
    Source = #table({"col"},{{1},{null}}),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"col", Int64.Type}}),
    #"Replaced Nulls" = Table.TransformColumns(#"Changed Type", {{"col", each if _ = null then Int64.From(0) else _}})
in
    #"Replaced Nulls"

这种方式更精准,直接针对Null值处理,能完整保留原列的整数类型。

内容的提问来源于stack exchange,提问作者Travis Bemrose

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:07:37