文章

Google 表格公式 - 检索2

本文介绍使用 INDEX 和 MATCH 检索

Google 表格公式 - 检索2

前文中我们介绍了使用 MAPFILTER 代替 VLOOKUP,但是在那种情景中,实际上每次进行过滤的时候,只有一行会被过滤出来,但是理论上 FILTER 应该会检查所有要被过滤的内容的,有可能要比 MATCHVLOOKUP 这种只输出匹配的第一个值的函数要慢一点。所以本文记录一下使用 MATCH 的替代方法。

MATCH

MATCH 函数接受三个参数,第一个参数是要匹配的值,第二个参数是要匹配的范围,这个范围 必须是一维的,也就是说只能是单行或者单列,否则会报错。第三个参数通常为 0(表示范围未排序)。

MATCH 返回的是第一个匹配的值在范围内的 索引

这里我们先选择 CHOOSEROWSMATCH 配合使用。

一个错误

最开始的思路是使用 MAPMATCH 返回一个要检索的索引数组,然后直接传递给 CHOOSEROWS 来重组每个索引对应的行。但是实际情况下,有时候要检索的值的个数可能并不固定,这样有时候 MATCH 就会尝试检索一个空值,得到的结果就是找不到该值,然后返回一个错误,这个错误会与其他能找到的索引一起组成数组传递给 CHOOSEROWS,但是后者不能处理错误,所以直接整个报错。

修正

对于此错误,暂时也没什么好的处理办法,只能放弃传递索引数组给 CHOOSEROWS 的方法,转换思路。先用 CHOOSEROWSMATCH 选出一行,再使用 MAP 对每一个要检索的值都进行该操作。如果遇到空值,直接排除掉。

如下样表,

 ABCDEFG
1IDNameAgeSex   
21Tom12M   
32John43M   
42Alice45F   
53Dom23M   
64Tina34F   

G2 中输入公式

=MAP(F2:F6, LAMBDA(x, IF(x="", "", CHOOSEROWS({B2:B6,D2:D6}, MATCH(x, A2:A6, 0)))))

 ABCDEFGH
1IDNameAgeSex RangeNameSex
21Tom12M 1TomM
32John43M 2JohnM
42Alice45F 4TinaF
53Dom23m    
64Tina34F    

可以看到,MAP 的范围是 F2:F6,虽然 F5F6 是空值,但也不影响检索。

该方式相比于使用 VLOOKUP 同样拥有不限制检索列的位置,以及自动矫正范围列的移动的特性。只不过相比于使用 FILTER 的性能差异,没有去实际测试。

INDEX

除了 CHOOSEROWS,更常与 MATCH 配合使用的是 INDEX

INDEX 接受三个参数,第一个参数是要索引的范围,第二个参数表示检索第几行,第三个参数表示检索第几列。当第二个参数为 0 时,会返回一整列,当第三个参数为 0 时,会返回一整行,都为 0 时,直接返回整个范围。

所以上例中将 G2 的公式改为

=MAP(F2:F6, LAMBDA(x, IF(x="", "", INDEX({B2:B6,D2:D6}, MATCH(x, A2:A6, 0), 0))))

可以达到相同的效果。可能 INDEXMATCH 组合更常见吧,所以推荐使用 INDEX 而非 CHOOSEROWS

FILTER 和 MATCH

其实两者的区别也挺明显,当结果会有多行的时候,使用 FILTER;当结果只能是单行的时候,使用 MATCH

本文由作者按照 CC BY 4.0 进行授权