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
相关产品推荐
相关产品推荐

