Power Query(M):如何让Text.Combine/Table.CombineColumns合并双null返回null?
问题解答:让Text.Combine/Table.CombineColumns在两列均为null时返回null
核心结论:Text.Combine和Table.CombineColumns没有内置参数可以直接实现这个需求,但可以通过包装内置函数或自定义合并器的方式达成效果,无需完全从零编写自定义函数。
内置函数的默认行为
Text.Combine会将列表中的null视为空文本,因此Text.Combine({null,null})返回空字符串"";Table.CombineColumns使用默认的Combiner.CombineTextByDelimiter时,同样遵循这个逻辑,导致两列均为null时合并结果为""而非null。
实现需求的两种替代方案
方案1:包装Text.Combine实现通用处理
编写一个包装函数,先判断输入列表是否全为null,再决定返回null还是调用原生Text.Combine:
let Source = #table( {"Column1","Column2"}, { {"1",null}, {null,"2"}, {null,null} } ), // 包装Text.Combine的自定义函数 Text.CombineWithNull = (texts as list, optional separator as nullable text) => if List.AllTrue(List.Transform(texts, (x) => x is null)) then null else Text.Combine(texts, if separator = null then "" else separator), // 使用包装函数合并列 merge_using_wrapped_textcombine = Table.AddColumn( Source, "MergeWithWrappedTextCombine", each Text.CombineWithNull({[Column1],[Column2]}) ) in merge_using_wrapped_textcombine
方案2:给Table.CombineColumns传自定义合并器
直接给Table.CombineColumns的合并器参数传入匿名函数,针对两列的情况做判断:
let Source = #table( {"Column1","Column2"}, { {"1",null}, {null,"2"}, {null,null} } ), // 使用自定义合并器的Table.CombineColumns merged_with_custom_combiner = Table.CombineColumns( Source, {"Column1","Column2"}, (cols) => if cols{0} is null and cols{1} is null then null else Text.Combine(cols, ""), "MergeWithCustomCombiner" ) in merged_with_custom_combiner
与原自定义函数的对比
原自定义函数针对固定两列设计,而上面两种方案更灵活:
- 包装Text.Combine的方式支持任意数量的列合并
- 自定义合并器的方式更贴合Table.CombineColumns的原生用法
内容的提问来源于stack exchange,提问作者FlexYourData
相关产品推荐
相关产品推荐

